﻿Imports Commander_Wars.Spieletools
'Imports System.Speech
'Imports System.Speech.Recognition
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Enum Sprachen
    Deutsch
    English
    'Francais
    'Espanol
    'Italiano
End Enum
Public Enum Armeen
    ''' <summary>
    ''' Orange Star
    ''' </summary>
    ''' <remarks></remarks>
    OS
    ''' <summary>
    ''' Blue Moon
    ''' </summary>
    ''' <remarks></remarks>
    BM
    ''' <summary>
    ''' Green Earth
    ''' </summary>
    ''' <remarks></remarks>
    GE
    ''' <summary>
    ''' Yellow Comet
    ''' </summary>
    ''' <remarks></remarks>
    YC
    ''' <summary>
    ''' Black Hole
    ''' </summary>
    ''' <remarks></remarks>
    BH
    ''' <summary>
    ''' Bolt Guard
    ''' </summary>
    ''' <remarks></remarks>
    BG
    ''' <summary>
    ''' Mecha Legion
    ''' </summary>
    ''' <remarks></remarks>
    ML
    ''' <summary>
    ''' Amber Corona
    ''' </summary>
    ''' <remarks></remarks>
    AC
    ''' <summary>
    ''' Brown Tundra
    ''' </summary>
    ''' <remarks></remarks>
    BT
    ''' <summary>
    ''' Gold Sun
    ''' </summary>
    ''' <remarks></remarks>
    GS
    ''' <summary>
    ''' Pink Frontier
    ''' </summary>
    ''' <remarks></remarks>
    PF
    ''' <summary>
    ''' Teal Isles
    ''' </summary>
    ''' <remarks></remarks>
    TI
    ''' <summary>
    ''' Dark Matter Defense Services
    ''' </summary>
    ''' <remarks></remarks>
    DM
    ''' <summary>
    ''' Independent Battalion
    ''' </summary>
    ''' <remarks></remarks>
    IB
    ''' <summary>
    ''' Lazuria
    ''' </summary>
    ''' <remarks></remarks>
    LZ
    ''' <summary>
    ''' New Rubinelle
    ''' </summary>
    ''' <remarks></remarks>
    NR
    ''' <summary>
    ''' Darkvania
    ''' </summary>
    ''' <remarks></remarks>
    DV
End Enum
Public Enum ArmeenNamen
    Orange_Star
    Blue_Moon
    Yellow_Comet
    Green_Earth
    Black_Hole
    Bolt_Guard
    Mecha_Legion
    Amber_Corona
    Brown_Tundra
    Gold_Sun
    Pink_Frontier
    Teal_Isles
    Dark_Matter
    Independent_Battalion
    Lazuria
    New_Rubinelle
    Darkvania
End Enum
Public Enum Nebelarten
    Aus
    Nebel
    Kriegsnebel
    Aufklaerungsnebel
End Enum
Public Enum CommanderWarsGameModi
    AdvanceWars
    AdvanceWars2
    AdvanceWarsDS
    CommanderWars
    AdvanceWarsDC
    ''' <summary>
    ''' Der neue CoW Modus
    ''' </summary>
    ''' <remarks></remarks>
    CommanderWars2
    ''' <summary>
    ''' Fire Emblem MOD unfinished
    ''' </summary>
    ''' <remarks></remarks>
    FireEmblem
End Enum
Public Enum TerrainStyle
    AdvanceWars
    AdvanceWars2
    CommanderWars
    AdvanceWarsDC
    CommanderWars2
    CustomWars
    CustomTerrainstyle1
    CustomTerrainstyle2
    CustomTerrainstyle3
End Enum
Public Enum KOSysteme
    Gabe_Modus
    CoW_Hybrid
    KO_Modus
End Enum
Public Class Hauptmenue
#Region "Win32 API"
    Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal Taste As Int16) As Short
    Function getTasteGedrueckt(ByVal Taste As Keys) As Boolean
        If IsNothing(Taste) Then Return False

        Dim b As Short = GetAsyncKeyState(Taste)
        If b = 0 Then Return 0 Else Return 1
    End Function
#End Region
#Region "Konstanten"
    ''' <summary>
    ''' Server Timeout in Millisekunden we wait this time before we resend our last paket
    ''' </summary>
    ''' <remarks></remarks>
    Public Const ServerTimeOut As Integer = 100
    Public Shared NeutralFarbe As Color = Color.FromArgb(255, 255, 255, 255)
    ''' <summary>
    ''' Die Einfaerbe Farbe des Neutralen Spielers
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared SpielerNeutral As Color = Color.FromArgb(255, 230, 230, 230)
    Public Const FeldbreiteKlein As Integer = 16
    Public Const FeldbreiteGross As Integer = 24
    Public Shared Feldbreite As Integer = FeldbreiteKlein
    Public Shared ZoomedIn As Boolean = False
    Public Const Breitbild As Single = 1 + 6 / 10
    Public Shared Rand As New Point
    Public Shared FensterRand As New Point
    ''' <summary>
    ''' Port used for a Game.
    ''' </summary>
    ''' <remarks></remarks>
    Public Const GamePort As Integer = 8000
    ''' <summary>
    ''' Port used for the Lobby.
    ''' </summary>
    ''' <remarks></remarks>
    Public Const LobbyPort As Integer = 8050
    Public Shared Codierung As System.Text.Encoding = System.Text.Encoding.UTF8
    Public Shared CodierungMap As System.Text.Encoding = System.Text.Encoding.Default
#End Region
#Region "Variablen"
    Public Shared ErsterStart As Boolean = True
    Public Shared AlleFarbtabellen() As Color = {}
    Public Shared Formmodus As Formmodi = Formmodi.Hauptmenue
    Public Shared Chatroom As Chat
    Public Verwalter As Objektverwalter = Nothing
    Public Shared SpielfeldPunkt As Point
    Public Shared MusikAnhalten As Boolean = False
    ''' <summary>
    ''' Gibt an ob wir Debuggen und deaktieviert ansonsten ein paar Dinge
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Debbuging As Boolean = True
    Public Shared ChatboxLocker As New Mutex
    Public Shared MainMenue As Hauptmenue
    ''' <summary>
    ''' Textbox fuer den Textinput
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared TextInput As TextBox
    ''' <summary>
    ''' Haben wir das Spiel geladen. Zum verhindern des Beendens vor dem Spiel ende.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared GameIni As Boolean = False
    ''' <summary>
    ''' Zeigt uns die eingegangenen Netzbefehle an.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared NetzProtokoll As Boolean = False
    ''' <summary>
    ''' The Data which is owned by the User.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared User As Userdata
#Region "Enumerationen"
    Enum Formmodi
        Hauptmenue
        Spiel
        Editor
        Optionen
        Kartenauswahl
        KartenauswahlMP
        LandkartenAuswahlKAMP
        SiegMenue
        Credits
        KOZufallMenue
        EinheitenAuswahlMenue
        KOBildAendern
        KeyMenue
        Usermenue
    End Enum

#End Region
#Region "Engines"
    Public Shared Bildengine As Grafikengine = Nothing
    Public Shared Schrift As Schriftengine = Nothing
#End Region
#End Region
#Region "Spielstart"
    Public Sub New()
        ' Dieser Aufruf ist fuer den Windows Form-Designer erforderlich.
        InitializeComponent()
        ' Fuegen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
        MainMenue = Me
        If Environment.CommandLine.ToLower.Contains("reset ") Then
            SetStandardEinstellungen(False)
        End If
        If Environment.CommandLine.ToLower.Contains("resetx ") Then
            SetStandardEinstellungen(True)
        End If
        If DataSettings.CommanderWarsGameModus < 0 Then
            DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.CommanderWars
        ElseIf DataSettings.CommanderWarsGameModus > CommanderWarsGameModi.CommanderWars2 Then
            DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.CommanderWars
        End If
        If DataSettings.TerrainStyle < 0 Then
            DataSettings.TerrainStyle = TerrainStyle.CommanderWars
        ElseIf DataSettings.TerrainStyle > TerrainStyle.CustomTerrainstyle3 Then
            DataSettings.TerrainStyle = TerrainStyle.CommanderWars
        End If
        DataSettings.MySettingsIniSave()
        'RechangeAllAeOeUess()
        'Me.CenterToScreen()
    End Sub
    Public Sub SetStandardEinstellungen(ByVal Sicherermodus As Boolean)
        If Sicherermodus Then
            DataSettings.Adapter = 0
            DataSettings.BildschirmBreite = 800
            DataSettings.BildschirmHoehe = 600
            DataSettings.Sprache = Sprachen.English
            DataSettings.Autor = "Anonym"
            DataSettings.draw3D = False
            DataSettings.Fenstermodus = True
            DataSettings.Groesse = New Size(800, 600)
            DataSettings.Hintergrundmusik = False
            DataSettings.MusikSound = False
            DataSettings.LetztesSpiel = ""
            DataSettings.TexturQuali = "Low"
            DataSettings.Verhaeltnis = 4 / 3
        End If
        DataSettings.MySettingsIniSave()
    End Sub
    Public Shared Sub SetStandardBildFormat()
        If Not ErsterStart Then
            If DataSettings.Fenstermodus Then
                'Groesse definieren
                BildschirmGroesseveraendern(800, 600)
                MainMenue.Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
            Else
                BildschirmGroesseveraendern(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
                MainMenue.Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
            End If
        ElseIf Not DataSettings.Fenstermodus Then
            BildschirmGroesseveraendern(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
            MainMenue.Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
        End If
        MainMenue.FormBorderStyle = ChangeFormBorderStyle()
    End Sub
    Public Sub LoadForm()

        Hauptmenue.MainMenue.Visible = False

        CreateRessourcePath()
        'Als erstes Mal den Fensterrand bestimmen...
        Dim OrgStyle As Windows.Forms.FormBorderStyle = Me.FormBorderStyle
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        Dim SZ As Size = Me.Size
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable
        FensterRand.X = (Me.Size.Width - SZ.Width) / 2
        FensterRand.Y = Me.Size.Height - SZ.Height - FensterRand.X
        Me.FormBorderStyle = OrgStyle
        If DataSettings.Fenstermodus Then
            Rand = FensterRand
        End If

        SetStandardBildFormat()

        If DataSettings.Fenstermodus Then
            If DataSettings.BildschirmBreite + Rand.X * 2 >= My.Computer.Screen.Bounds.Width Then
                DataSettings.BildschirmBreite = My.Computer.Screen.Bounds.Width - Rand.X * 2
                DataSettings.MySettingsIniSave()
            End If
            If DataSettings.BildschirmHoehe + Rand.Y + Rand.X >= My.Computer.Screen.Bounds.Height Then
                DataSettings.BildschirmHoehe = My.Computer.Screen.Bounds.Height - Rand.Y - Rand.X
                DataSettings.MySettingsIniSave()
            End If
            Me.Size = New Size(DataSettings.BildschirmBreite + Rand.X * 2, DataSettings.BildschirmHoehe + Rand.Y + Rand.X)
        Else
            Me.Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
        End If

        AktualisierenTaskbar()

        Cursor.Hide()
        Me.Visible = True
        'Hier werden die Verweise erstellt

        'Solange ich das nicht abfangen kann! :(
        Me.MaximizeBox = False

        Me.UpdateStart.Start()
    End Sub
    ''' <summary>
    ''' Recreates eventually missing Ressourcepath.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub CreateRessourcePath()
        If My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "Units\") = False Then
            DataSettings.ErsterStart = False
            DataSettings.MySettingsIniSave()
        End If
        If DataSettings.ErsterStart = False Then
            Dim s As String = System.Windows.Forms.Application.ExecutablePath
            'Nur beim Testen muss die untere Zeile 3 mal durchgefuehrt werden
            s = s.Remove(s.LastIndexOf("\"))
            '#################################
            If Not My.Computer.FileSystem.DirectoryExists(s + "\Resources\Scripts") Then
                s = s.Remove(s.LastIndexOf("\"))
                s = s.Remove(s.LastIndexOf("\"))
            End If
            '#################################
            s = s + "\Resources\"
            DataSettings.Resourcenpfad = s
            My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "Maps\")
            'Wir legen den Bildschirmausschnitt fest
            If DataSettings.BildschirmBreite <= 0 Or DataSettings.BildschirmHoehe <= 0 Then
                If Not DataSettings.Fenstermodus Then
                    BildschirmGroesseveraendern(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
                Else
                    BildschirmGroesseveraendern(800, 600)
                End If
                MainMenue.Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
            End If
            DataSettings.ErsterStart = True
            DataSettings.MySettingsIniSave()
        End If
    End Sub
    Private Sub Spielladen()
        If Not CheckAssemblies() Then
            Me.Close()
            frmSplashScreen.SplScreen.Close()
            Grafikengine.IsDrawing = True
            Exit Sub
        End If


        'If Not VideoKlasse.Beschaeftigtabspielen Then Me.Visible = False

        Me.Verwalter = New Objektverwalter()

        Dim ada As Integer = DataSettings.Adapter
        If ada >= Manager.Adapters.Count Then
            ada = 0 'hier scheint was schief gelaufen zu sein.
            DataSettings.Adapter = ada
        End If

        'Grafikengine laden
        If DataSettings.Fenstermodus Then
            Bildengine = New Grafikengine(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe, Me, True, ada)
        Else 'Falls wir richtigen Vollbild einfuehren
            If Debbuging Then
                Bildengine = New Grafikengine(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe, Me, True, ada)
            Else
                Bildengine = New Grafikengine(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe, Me, False, ada)
            End If

        End If
        Dim KonsolenThread As New Threading.Thread(AddressOf KonsolenIntro)
        KonsolenThread.Name = "Intro Thread"
        KonsolenThread.Start()

        Konsole.Write("")
        Konsole.Write("Setup Engines...")
        'Musikengine laden
        MusikEngine.LoadDevice(Me.Handle)
        Schrift = New Schriftengine()
        SprachIni()
        'Objekte erstellen
        Objektverwalter.IniVerwalter()
        Objektverwalter.Maus = New ObjektMaus()
        'Das Alphabet wird erstellt
        Konsole.Write("Setup Game Values...")
        ObjektAlphabet.LoadAlphabete()
        Sprachconverter.LoadLanguage()
        'Texturen Laden
        TexturenHalter.LoadTexturen()
        TexturenHalter.LoadModusTexturen()

        Konsole.Write("Launch Game...")
        'Reihe 1:OS-BH
        'Reihe 2:BG-DM
        'Reihe 3:IB-NR
        'Reihe 4:Andere
        AlleFarbtabellen = New Color() _
        {Color.FromArgb(255, 255, 77, 0), Color.FromArgb(255, 31, 199, 255), Color.FromArgb(255, 0, 255, 0), Color.FromArgb(255, 255, 199, 0), Color.FromArgb(255, 181, 148, 140), _
         Color.FromArgb(255, 180, 180, 180), Color.FromArgb(255, 76, 109, 109), Color.FromArgb(255, 252, 141, 0), Color.FromArgb(255, 225, 113, 0), Color.FromArgb(255, 244, 0, 244), Color.FromArgb(255, 163, 191, 141), Color.FromArgb(255, 0, 213, 213), _
         Color.FromArgb(255, 234, 23, 0), Color.FromArgb(255, 0, 42, 214), Color.FromArgb(255, 251, 224, 12), _
         Color.FromArgb(255, 148, 0, 211), Color.Blue, Color.Brown, Color.Green, Color.FromArgb(255, 185, 55, 136), Color.FromArgb(255, 103, 103, 103), Color.FromArgb(255, 204, 0, 204)}
        'For Each File In My.Computer.FileSystem.GetFiles("ierung\Commander Wars\KOs")
        '    ObjektLadeklasse.ImportKOfromCW(File)
        'Next
        '  ObjektLadeklasse.ImportAWDorStandUnit("erung\Commander Wars\Custom Wars Dor\resources\res\plugin\dor\images\unit1s.png", "mierung\Commander Wars\Programm\Commander Wars\Output\")
        'Ini new Userdata or load old ones.
        User = New Userdata
        'Dim S As Sprachen = DataSettings.Sprache
        'ObjektLadeklasse.TranslateIDInNameAndSave("mierung\Commander Wars\Programm\Commander Wars\Output\" + S.ToString + ".txt")
        Konsole.KonsolenIntro = False
        While KonsolenThread.ThreadState = Threading.ThreadState.Running
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        KonsolenThread.Abort()
        KonsolenThread = Nothing
        'Start the Intro
        PlayIntroMovie()

        Ini(Formmodi.Hauptmenue)

        GameIni = True

        If Not frmSplashScreen.SplScreen Is Nothing Then
            Do While VideoKlasse.BeschaeftigtAbspielen And (Not getTasteGedrueckt(DataSettings.Bestaetigen))
                Threading.Thread.Sleep(ThreadSleepTime)
                My.Application.DoEvents()
            Loop
            VideoKlasse.Abbrechen()
            frmSplashScreen.SplScreen.Close()
        Else
            If VideoKlasse.BeschaeftigtAbspielen Then
                VideoKlasse.Abbrechen()
            End If
        End If



        'If Not DataSettings.Fenstermodus Then
        '    Me.Location = New Point
        'End If

        'Fenstermodus?
        ChangeWindowMode()

        Hauptmenue.MainMenue.Visible = True
        Hauptmenue.MainMenue.Focus()
        ErsterStart = False


    End Sub
    Public Shared Sub BildschirmGroesseveraendern(ByVal Breite As Integer, ByVal Hoehe As Integer)
        If DataSettings.Fenstermodus Then
            DataSettings.BildschirmBreite = Breite - Rand.X * 2
            DataSettings.BildschirmHoehe = Hoehe - Rand.Y - Rand.X
            Hauptmenue.MainMenue.Size = New Size(DataSettings.BildschirmBreite + Rand.X * 2, DataSettings.BildschirmHoehe + Rand.Y + Rand.X)
        Else
            DataSettings.BildschirmBreite = Breite
            DataSettings.BildschirmHoehe = Hoehe
            Hauptmenue.MainMenue.Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
        End If
        DataSettings.StandardVollbildschirmBreite = My.Computer.Screen.Bounds.Width
        DataSettings.StandardVollbildschirmHoehe = My.Computer.Screen.Bounds.Height
        Dim Verhaeltnis As Single = DataSettings.BildschirmBreite / DataSettings.BildschirmHoehe
        Dim Eineindrittel As Single = 1 + 1 / 3
        If Verhaeltnis = Breitbild Then
            DataSettings.Verhaeltnis = Breitbild
            DataSettings.Streckfaktor = DataSettings.BildschirmBreite / 1280
        ElseIf Verhaeltnis = Eineindrittel Then
            DataSettings.Verhaeltnis = Eineindrittel
            DataSettings.Streckfaktor = DataSettings.BildschirmBreite / 800
        Else
            DataSettings.Verhaeltnis = Eineindrittel
            DataSettings.Streckfaktor = 1
        End If
        DataSettings.MySettingsIniSave()
    End Sub
    Public Shared Sub Ini(ByVal Modus As Formmodi, Optional ByVal Spielstand As Boolean = False, Optional ByVal SpielfeldNichtLoeschen As Boolean = False)
        Pause = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While

        If Not DataSettings.LobbyHost Then
            If Lobby IsNot Nothing Then
                Lobby.CloseLobby()
            End If
        End If

        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Open Menu: " + Modus.ToString)
        End If
        If Modus = Formmodi.SiegMenue Then
            Connection.Close(False)
            IniSiegMenue()
            Exit Sub
        End If

        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        NetzVorratsBefehle.Clear()

        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
        Reset()
        Formmodus = Modus
        Objektverwalter.Reset(SpielfeldNichtLoeschen)
        ObjektMaus.Visible = True
        Select Case Modus
            Case Formmodi.KeyMenue
                Objektverwalter.Menue = New ObjektKeymenue
            Case Formmodi.Hauptmenue
                Objektverwalter.Menue = New ObjektHauptmenue()
            Case Formmodi.Editor
                Objektverwalter.Menue = New ObjektKarteneditormenue()
            Case Formmodi.Spiel

                If Spielstand = True Then
                    Objektverwalter.Menue = New ObjektSpielMenue(Spielstand, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler)
                    Objektverwalter.Spielfeld.SpielWiederaufnehmen()
                Else

                    If TypeOf Objektverwalter.Menue Is ObjektKartenauswahlMenue Then
                        Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
                        Objektverwalter.Menue = New ObjektSpielMenue(Spielstand, Objektverwalter.Spielfeld.Regeln.Startspieler)

                    ElseIf TypeOf Objektverwalter.Menue Is ObjektKartenauswahlLandkartenMenue Then
                        Dim M As ObjektKartenauswahlLandkartenMenue = Objektverwalter.Menue
                        Objektverwalter.Menue = New ObjektSpielMenue(Spielstand, Objektverwalter.Spielfeld.Regeln.Startspieler)
                    ElseIf TypeOf Objektverwalter.Menue Is ObjektHauptmenue Then
                        Objektverwalter.Menue = New ObjektSpielMenue(Spielstand, )
                    End If
                    'Jetzt muss evtl. z. Bsp. die KI gestartet werden.
                End If
            Case Formmodi.Kartenauswahl
                Objektverwalter.Menue = New ObjektKartenauswahlMenue
            Case Formmodi.KartenauswahlMP
                Objektverwalter.Menue = New ObjektNetzwerkMenue
            Case Formmodi.Optionen
                Objektverwalter.Menue = New ObjektOptionsMenue
            Case Formmodi.Credits
                Objektverwalter.Menue = New ObjektCreditMenue("MainCredits")
            Case Formmodi.KOZufallMenue
                Objektverwalter.Menue = New ObjektKORandomMenue
            Case Formmodi.EinheitenAuswahlMenue
                Objektverwalter.Menue = New ObjektUnitSelectMenu
            Case Formmodi.KOBildAendern
                Objektverwalter.Menue = New ObjektKOBildAendernMenue
            Case Formmodi.Usermenue
                Objektverwalter.Menue = New ObjektUsermenue
        End Select
        Objektverwalter.Menue.IniMenue()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            If Not Spielstand Then
                Objektverwalter.Zentrieren()
            End If
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        MusikZufaellig()
        SprachReload(Modus)
        If Not ErsterStart Then
            Hauptmenue.MainMenue.UpdateStart.Start()
        End If
    End Sub
    Public Shared Sub IniLandkartenMenue(ByVal Pfad As String, ByVal ErsterStart As Boolean)
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        Pause = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue

        Reset()
        Formmodus = Formmodi.LandkartenAuswahlKAMP
        Objektverwalter.Reset(False)
        ObjektMaus.Visible = True
        If ErsterStart = True Then
            Objektverwalter.Menue = New ObjektKartenauswahlLandkartenMenue(Pfad)
        Else
            'Jetzt muesst zuerst das Objekt erstellt werden.


        End If
        Objektverwalter.Menue.IniMenue()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Zentrieren()
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        MusikZufaellig()
        SprachReload(Formmodi.LandkartenAuswahlKAMP)
        Hauptmenue.MainMenue.UpdateStart.Start()

    End Sub
    Public Shared Sub IniLandkartenMenue(ByVal LandkartenInfo As ObjektLandkartenInfos)
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        Pause = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
        Reset()
        Formmodus = Formmodi.LandkartenAuswahlKAMP
        Objektverwalter.Reset(False)
        ObjektMaus.Visible = True
        Objektverwalter.Menue = New ObjektKartenauswahlLandkartenMenue(LandkartenInfo)
        Objektverwalter.Menue.IniMenue()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Zentrieren()
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        MusikZufaellig()
        SprachReload(Formmodi.LandkartenAuswahlKAMP)
        Hauptmenue.MainMenue.UpdateStart.Start()

    End Sub
    Public Shared Sub IniSiegMenue()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.EingabenErlauben = False
            If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
                If Objektverwalter.Spielfeld.CurrentAI.KIThreat IsNot Nothing Then
                    Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                    Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
                    Objektverwalter.Spielfeld.CurrentAI = Nothing
                End If
            End If
        End If
        Pause = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
        Reset()
        Formmodus = Formmodi.SiegMenue

        ObjektMaus.Visible = True
        Dim Farben(Objektverwalter.Spielfeld.Spieler.Length - 2) As Color
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            Farben(I - 1) = Objektverwalter.Spielfeld.Spieler(I).Farbe
        Next
        Dim LetzterSpieler As Integer = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            Objektverwalter.Spielfeld.AktuellerSpieler = Objektverwalter.Spielfeld.Spieler(I)
            If Objektverwalter.Spielfeld.Aufzeichnung.Aufzeichnungen(Objektverwalter.Spielfeld.Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(I - 1, 0) Is Nothing Then
                Objektverwalter.Spielfeld.Aufzeichnung.UpdateAufzeichnungen(True, True)
            End If
            If Objektverwalter.Spielfeld.Aufzeichnung.Aufzeichnungen(Objektverwalter.Spielfeld.Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(I - 1, 1) Is Nothing Then
                Objektverwalter.Spielfeld.Aufzeichnung.UpdateAufzeichnungen(False, True)
            End If
        Next
        Objektverwalter.Spielfeld.AktuellerSpieler = Objektverwalter.Spielfeld.Spieler(LetzterSpieler)
        Objektverwalter.Menue = New ObjektSiegMenue(Objektverwalter.Spielfeld.Aufzeichnung, Farben, Objektverwalter.Spielfeld.ObjektLandkartenInfo, Objektverwalter.Spielfeld.NaechsteKarte, Objektverwalter.Spielfeld.Spieler)

        Objektverwalter.Reset(False)
        Objektverwalter.Menue.IniMenue()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Zentrieren()
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        MusikZufaellig()
        SprachReload(Formmodi.SiegMenue)
        Hauptmenue.MainMenue.UpdateStart.Start()

    End Sub
    Public Shared Function Farbtabelleerstellen(ByVal StartFarbe As Color) As Image
        Dim B As New Bitmap(12, 1, Imaging.PixelFormat.Format24bppRgb)
        Dim B2 As New Bitmap(1, 1, Imaging.PixelFormat.Format24bppRgb)
        B2.SetPixel(0, 0, StartFarbe)
        Dim B3 As Bitmap = Grafikengine.Helligkeitveraendern(B2, -0.25)
        B.SetPixel(0, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitveraendern(B2, -0.15)
        B.SetPixel(1, 0, B3.GetPixel(0, 0))
        B.SetPixel(2, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitveraendern(B2, 0.3)
        B.SetPixel(3, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitveraendern(B2, 0.5)
        B.SetPixel(4, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitveraendern(B2, -0.4)
        B.SetPixel(5, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitveraendern(B2, -0.3)
        B.SetPixel(6, 0, B3.GetPixel(0, 0))
        B.SetPixel(7, 0, StartFarbe)
        B3 = Grafikengine.Helligkeitveraendern(B2, 0.3)
        B.SetPixel(8, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitveraendern(B2, 0.4)
        B.SetPixel(9, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitveraendern(B2, -0.1)
        B.SetPixel(10, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitveraendern(B2, -0.05)
        B.SetPixel(11, 0, B3.GetPixel(0, 0))
        'Momentan speichern wir die Farbtabelle nicht ab.
        '  B.Save(DataSettings.Resourcenpfad + "Farbtabellen\" + StartFarbe.ToString + ".bmp")
        Return B
    End Function
    ''' <summary>
    ''' Zeigt das Intro an.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub PlayIntroMovie()
        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Intro\Intro.avi") And (Not DataSettings.TaskAnzeigenModus = TaskleistenAnzeige.Versteckt) Then
            If DataSettings.Fenstermodus Then
                Hauptmenue.MainMenue.pVideo.Width = Me.Width
                Hauptmenue.MainMenue.pVideo.Height = Me.Height
                VideoKlasse.Neu(DataSettings.Resourcenpfad + "Intro\Intro.avi", Hauptmenue.MainMenue.pVideo, False, True)
            Else
                Hauptmenue.MainMenue.pVideo.Width = Me.Width
                Hauptmenue.MainMenue.pVideo.Height = Me.Height
                VideoKlasse.Neu(DataSettings.Resourcenpfad + "Intro\Intro.avi", Hauptmenue.MainMenue.pVideo, True, True)
            End If
        End If

        If VideoKlasse.BeschaeftigtAbspielen Then
            Hauptmenue.MainMenue.Visible = True
        Else
            Hauptmenue.MainMenue.Visible = False
        End If

        If Not DataSettings.Fenstermodus And Not Debbuging Then
            VideoKlasse.Abbrechen()
        End If
    End Sub
    ''' <summary>
    ''' Zeigt die Konsole an.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KonsolenIntro()
        Konsole.Aktiv = True
        While Konsole.KonsolenIntro
            Dim Ticks As Long = Now.Ticks
            Dim FT2 As Long = FrameTicks + CLng(TimeSpan.TicksPerSecond / DataSettings.SpielGeschwindigkeit)
            If FT2 > Ticks Then
                Continue While
            Else
                FrameTicks = Now.Ticks
            End If
            'FPS errechnen
            If FPSS = Now.Second Then
                FPSN += 1
            Else
                FPS = FPSN
                FPSN = 0
                FPSS = Now.Second
            End If
            If Grafikengine.Updateframe = False Then
                Engineladen()
            End If
            Cursor.Hide()
        End While
        Cursor.Show()
        Konsole.Aktiv = False
        Konsole.Fullscreen = False
        Konsole.Input = True
    End Sub

    Public Function CheckAssemblies() As Boolean
        Dim Assemblies() As System.Reflection.Assembly = AppDomain.CurrentDomain.GetAssemblies()

        NoAssemblyFound = True
        Dim DirectXAssembly As Boolean = False
        For I = 0 To Assemblies.Length - 1
            If Assemblies(I).CodeBase.ToLower.EndsWith("System.Speech.dll".ToLower) Then
                NoAssemblyFound = False
            ElseIf Assemblies(I).CodeBase.ToLower.EndsWith("Microsoft.DirectX.dll".ToLower) Then
                DirectXAssembly = True
            End If
        Next
        If Not DirectXAssembly Then
            MessageBox.ShowMessageBox("You didn't installed the newest Version of DirectX 9. The Game can't be launched. Please install the Version before running the game again.", MsgBoxStyle.OkOnly, "Assembly Missing")
            Return False
        Else
            Return True
        End If
    End Function
#End Region
#Region "Musik"
    'Musik
    ''' <summary>
    ''' Waehlt per Zufall ein neues Musikstueck aus und spielt es ab.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub MusikZufaellig()
        'Dim Pfad As String = DataSettings.Resourcenpfad + "Sound\Backgroundmusic\" + Formmodus.ToString
        'Pfad = Musikauswaehlen(Pfad)
        If DataSettings.MusikSound And DataSettings.Hintergrundmusik Then
            Dim Pfad As String = DataSettings.Resourcenpfad + "Sound\Backgroundmusic\"
            Dim ListeGesamt As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
            Dim Liste() As String = {}
            If Not Formmodus = Formmodi.Spiel Then
                Pfad += Formmodus.ToString + "\"
                If My.Computer.FileSystem.DirectoryExists(Pfad) Then 'Die Sicherheitsabfrage ist dringend noetig, so oft wie wir da schon rausgeflogen sind... ausserdem, der Fehler kommt immer wieder, weil es immer wieder neue Menues gibt ;) Hiermit beseitige ich also schon zukuenftige Fehler cool nich?
                    ListeGesamt = My.Computer.FileSystem.GetFiles(Pfad)
                    For Each Musik In ListeGesamt
                        Array.Resize(Liste, Liste.Length + 1)
                        Liste(Liste.Length - 1) = Musik
                    Next
                End If
            Else
                Pfad += "CO's\"
                ReDim Liste(0)
                If TypeOf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0) Is KOCustom And Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                    Liste(0) = DataSettings.Resourcenpfad + "!Custom\CO\CO Music\" + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Musik + ".mp3"
                    If Not My.Computer.FileSystem.FileExists(Liste(0)) Then
                        Liste(0) = Pfad + "Andy.mp3"
                    End If
                Else
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Gabe Then
                        If TypeOf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0) Is KOCustom Then
                            Liste(0) = DataSettings.Resourcenpfad + "!Custom\CO\CO Music\" + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemusik + ".mp3"
                        Else
                            Liste(0) = Pfad + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemusik + ".mp3"
                        End If
                        If My.Computer.FileSystem.FileExists(Liste(0)) = False Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.ML.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BG.ToString Then
                                Liste(0) = Pfad + "BH Gabe" + ".mp3"
                            Else
                                Liste(0) = Pfad + "Gabe" + ".mp3"
                            End If
                        End If
                    ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Spezialgabe Then
                        If TypeOf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0) Is KOCustom Then
                            Liste(0) = DataSettings.Resourcenpfad + "!Custom\CO\CO Music\" + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Spezialgabemusik + ".mp3"
                        Else
                            Liste(0) = Pfad + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Spezialgabemusik + ".mp3"
                        End If
                        If My.Computer.FileSystem.FileExists(Liste(0)) = False Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.ML.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BG.ToString Then
                                Liste(0) = Pfad + "BH Spezialgabe" + ".mp3"
                            Else
                                Liste(0) = Pfad + "Spezialgabe" + ".mp3"
                            End If
                        End If
                    ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                        If TypeOf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0) Is KOCustom Then
                            Liste(0) = DataSettings.Resourcenpfad + "!Custom\CO\CO Music\" + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Doppelgabemusik + ".mp3"
                        Else
                            Liste(0) = Pfad + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Doppelgabemusik + ".mp3"
                        End If
                        If My.Computer.FileSystem.FileExists(Liste(0)) = False Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.ML.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BG.ToString Then
                                Liste(0) = Pfad + "BH Doppelgabe" + ".mp3"
                            Else
                                Liste(0) = Pfad + "Doppelgabe" + ".mp3"
                            End If
                        End If
                    End If
                    If Liste(0) = "" Then
                        If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                            Liste(0) = Pfad + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Musik + ".mp3"
                            If My.Computer.FileSystem.FileExists(Liste(0)) = False Then
                                Liste(0) = Pfad + "Andy.mp3"
                            End If
                        ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Gabe Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.ML.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BG.ToString Then
                                Liste(0) = Pfad + "BH Gabe" + ".mp3"
                            Else
                                Liste(0) = Pfad + "Gabe" + ".mp3"
                            End If
                        ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Spezialgabe Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.ML.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BG.ToString Then
                                Liste(0) = Pfad + "BH Spezialgabe" + ".mp3"
                            Else
                                Liste(0) = Pfad + "Spezialgabe" + ".mp3"
                            End If
                        ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.ML.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BG.ToString Then
                                Liste(0) = Pfad + "BH Doppelgabe" + ".mp3"
                            Else
                                Liste(0) = Pfad + "Doppelgabe" + ".mp3"
                            End If
                        End If
                    End If
                End If
            End If
            If Liste.Length > 0 Then
                Pfad = Liste(Zufallszahl(0, Liste.Length - 1))
                MusikEngine.LoadMusik(Pfad)
            End If
        End If
    End Sub
    Private Shared Function Musikauswaehlen(ByVal Pfad As String) As String
        Select Case Formmodus
            Case Formmodi.Hauptmenue
                'Der maximal Wert muss je nach Anzahl der Stuecke noch geaendert werden
                Return Pfad + "_" + Zufallszahl(0, 1).ToString + ".mid"
            Case Formmodi.Optionen
                'Der maximal Wert muss je nach Anzahl der Stuecke noch geaendert werden
                Return Pfad + "_" + Zufallszahl(0, 1).ToString + ".mid"
            Case Formmodi.Spiel
                'Beim Spiel wird es etwas komplizierter

            Case Formmodi.Editor
                'Der maximal Wert muss je nach Anzahl der Stuecke noch geaendert werden
                Return Pfad + "_" + Zufallszahl(0, 0).ToString + ".mid"
        End Select
        Return Pfad
    End Function
    Public Shared Sub MusikauswaehlenCustom(ByVal Pfad As String)
        If Pfad.ToLower.Trim = "default" Then
            MusikZufaellig()
        End If

        Pfad = Pfad.ToLower.Trim
        Dim Datei As String = ""
        If Pfad(1) = ":" Then
            'Ein absoluter Pfad, das ist zwar eigentlich nicht gut, aber mal schauen, ob wir dort musik finden..
            If My.Computer.FileSystem.FileExists(Pfad) Then
                Datei = Pfad
            End If
        Else
            If Pfad.StartsWith("\Resources\".ToLower) Or Pfad.StartsWith("Resources\".ToLower) Then
                'Ein pfad relativ zu den resourcen.
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + Pfad.Replace("\Resources\".ToLower, "").Replace("Resources\".ToLower, "")) Then
                    Datei = DataSettings.Resourcenpfad + Pfad.Replace("\Resources\".ToLower, "").Replace("Resources\".ToLower, "")
                End If
            Else
                'ich nehme an die musik befindet sich ordnungsgemaess..
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "!Custom\Music\" + Pfad) Then
                    Datei = DataSettings.Resourcenpfad + "!Custom\Music\" + Pfad
                Else
                    'Die datei gibt es nicht....
                    If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + Pfad) Then
                        'nur falsch eingeordnet, aber immerhin gibt es ueberhaupt etwas zu hoeren.
                        Datei = DataSettings.Resourcenpfad + Pfad
                    Else
                        Konsole.Write("Couldn't find Music-File: " + DataSettings.Resourcenpfad + Pfad)
                        Konsole.Write("Continuing the Game without this great Music.")
                        'Console.WriteLine("konnte folgende Musik nicht finden: " + Pfad)
                    End If
                End If
            End If
        End If
        If Not Datei = "" Then
            'Es wurde also schlussendlich etwas gefunden, was nun abgespielt werden kann.
            MusikEngine.LoadMusik(Datei)
        End If
    End Sub

#End Region
#Region "Update"
    Public Const Draw2DIn3D As Boolean = False

    Public Shared Scrollen As Boolean = False
    Public Shared ScrollenKameraKippen As Boolean = False
    Public Shared ScrollenX, ScrollenY As Integer
    Public Shared Rechteck As Rectangle
    Public Shared Pause As Boolean = False
    ''' <summary>
    ''' Erst auf True setzen, dann warten bis IsDrawing=false dann Objekte laden und Diesen wert auf True setzen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared PauseFuerObjekteLaden As Boolean = False
    Public Shared FPSS As Integer
    Public Shared FPSN As Integer
    Public Shared FPS As Integer
    Public Shared FrameTicks As Long
    Public Shared Frame As Integer = 0

    Private Sub UpdateStart_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UpdateStart.Tick
        UpdateStart.Stop()
        If ErsterStart = True Then Spielladen()
        If Pause = True Then
            Pause = False

            If Grafikengine.IsDrawing = False Then
                Updateframe()
            End If
        End If
    End Sub
    Public Shared Sub Updateframe()
        Do While Pause = False
            'Frames per Second
            While VideoKlasse.Beschaeftigt Or PauseFuerObjekteLaden
                Threading.Thread.Sleep(100)
            End While
            If MusikAnhalten = True Then
                MusikEngine.MusikStop()
                MusikAnhalten = False
            End If
            If MusikEngine.MusikStopped Or MusikEngine.MusikEnded Then
                MusikZufaellig()
            End If
            Dim Ticks As Long = Now.Ticks
            Dim FT2 As Long = FrameTicks + CLng(TimeSpan.TicksPerSecond / DataSettings.SpielGeschwindigkeit)
            If FT2 > Ticks Then
                'Wir fuehren alles in der momentanen Schleife aus
                My.Application.DoEvents()
                'Jetzt sollte kein Esc problem auftreten.
                Continue Do
            Else
                FrameTicks = Now.Ticks
            End If
            'Hier wird ja abgearbeitet, wenn wir geklickt haben oder eine Taste gedrueckt.
            'Da ich noch das MultiThreadingproblem habe mit dem Netzwerk. Pruefe ich hier nochmal ein paar sachen ab.
            If Connection IsNot Nothing Then
                If Connection.Connected Then 'Andernfalls koennen wir ganz normal weiterspielen :)
                    If TypeOf Objektverwalter.Menue Is ObjektNetzwerkMenue Then
                        Dim M As ObjektNetzwerkMenue = Objektverwalter.Menue
                        M.PruefenWeiter()
                        M.Spielstartpruefen()
                    End If
                End If
            End If
            'Cursor Update
            If Objektverwalter.Menue IsNot Nothing Then
                Objektverwalter.Menue.SetMausBild()
            End If
            'FPS errechnen
            If FPSS = Now.Second Then
                FPSN += 1
            Else
                FPS = FPSN
                FPSN = 0
                FPSS = Now.Second
            End If
            'Musikengine Wav Update
            MusikEngine.FrameMusik()
            'Zuerst ueberpruefen wir ob wir gewonnen haben
            If Formmodus = Formmodi.Spiel Then
                If Objektverwalter.Spielfeld.Regeln.Spielende = True Then
                    Objektverwalter.Spielfeld.Aufzeichnung.UpdateAufzeichnungen(False)
                    'Gewonnen, oder nur Runde vorbei?
                    'Script pruefen
                    ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
                    Dim M As ObjektSpielMenue = Objektverwalter.Menue
                    If M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts Then
                        If Not Hauptmenue.AufzeichnungAbspielen Then
                            If Not Objektverwalter.Spielfeld.CurrentAI Is Nothing Then
                                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                                Objektverwalter.Spielfeld.CurrentAI = Nothing
                            End If
                            ObjektMaus.Visible = True
                            Dim S As ObjektSpielMenue = Objektverwalter.Menue
                            S.Dispose()
                        End If
                    End If
                End If
            End If
            'Wir legen die Mauskoordinaten fest
            'Einige Formen haben bestimmte Events diese werden jetzt ausgefuehrt
            If Not Objektverwalter.Menue Is Nothing Then
                Objektverwalter.Menue.Frame()
                Objektverwalter.Menue.ShowToolTip()
            End If
            Frame += 1
            If IsNothing(Objektverwalter.Spielfeld) = False Then
                If Objektverwalter.Spielfeld.LaufenLoeschen = True Then
                    If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                        Objektverwalter.Spielfeld.Laufen.Locker.Lock()
                        Objektverwalter.Spielfeld.Laufen = Nothing
                        'Objektverwalter.Spielfeld.Laufen.Locker.Unlock()
                        Objektverwalter.Spielfeld.AutoEndTurn()
                    End If
                    Objektverwalter.Spielfeld.LaufenLoeschen = False
                End If
                If IsNothing(Objektverwalter.Spielfeld.Laufen) = False Then
                    'Es wird oefter gelaufen als Bilder Geupdatet
                    If Objektverwalter.Spielfeld.Laufen.Laufen = True Then
                        'Die Einheit hat ihr Ziel erreicht
                        'wir lassen ein Menue erscheinen
                        If Objektverwalter.Spielfeld.Laufen.Zielerreicht = False Then
                            If Objektverwalter.Spielfeld.Laufen.Falle = True Then
                                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                    'Hier komm jetzt noch ein Pfeil mit der Schrift Falle It's a trap
                                    Objektverwalter.NeuObjektAnimation(Objektverwalter.Spielfeld.Laufen.Position.X, Objektverwalter.Spielfeld.Laufen.Position.Y, "Falle", "Falle")
                                    Objektverwalter.Spielfeld.Laufen.Zielerreicht = True
                                    If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).FallenAngriff = True Then
                                        If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOBoostApply(Objektverwalter.Spielfeld.AktuelleEinheit) Then
                                            Dim Gegner As Point = Objektverwalter.Spielfeld.Laufen.GetNextFeld
                                            If Objektverwalter.KannAngreifen(Gegner.X, Gegner.Y, Objektverwalter.Spielfeld.Laufen.Position.X, Objektverwalter.Spielfeld.Laufen.Position.Y, False, Objektverwalter.Spielfeld.AktuelleEinheit.GetMap) = True Then
                                                Objektverwalter.Angriff(Objektverwalter.Spielfeld.AktuelleEinheit, Gegner.X, Gegner.Y)
                                            Else
                                                Objektverwalter.Warten()
                                            End If
                                        Else
                                            Objektverwalter.Warten()
                                        End If
                                    Else
                                        Objektverwalter.Warten()
                                    End If
                                Else
                                    'Wir sind auch in eine Falle gelaufen damn ist
                                    'Zum Glueck bekommt das niemand mit.
                                    Objektverwalter.Warten()
                                End If
                            Else
                                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                    Objektverwalter.Spielfeld.Laufen.Zielerreicht = True
                                    Objektverwalter.Befehlsmenuerschaffen()
                                Else
                                    Objektverwalter.Spielfeld.Laufen.Zielerreicht = True
                                    '  Objektverwalter.Spielfeld.CurrentAI.KISchleifeZiehen()
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            'Updates vor dem naechsten Malen
            If Frame >= 3 Then
                Grafikengine.Grafikkarte.EvictManagedResources()
                Frame = 0
                FramesAktualisieren()
            End If
            'Wir zeichnen das neue Bild
            If Grafikengine.Updateframe = False Then
                Engineladen()
            End If

            My.Application.DoEvents()
        Loop
    End Sub
    Public Shared Sub Engineladen()

    End Sub
    Public Shared Sub SpielfeldScrollen()
        'Hier wird gescrollt bis ins unendliche
        If DataSettings.draw3D Then
            If Hauptmenue.ScrollenKameraKippen Then
                If Objektverwalter.Spielfeld IsNot Nothing Then
                    With Objektverwalter.Spielfeld
                        Dim deltaX As Integer = ObjektMaus.XKoordinate - Hauptmenue.ScrollenX
                        Dim deltaY As Integer = ObjektMaus.YKoordinate - Hauptmenue.ScrollenY
                        'Dim Alpha As Double = Math.Atan(.KameraRichtung.Z / .KameraRichtung.X)
                        ' .KameraRichtung = New Microsoft.DirectX.Vector3(.KameraRichtung.X, -100, Math.Tan((Alpha * Math.PI / 180 + deltaX) * 180 / Math.PI) * .KameraRichtung.X)
                        .KameraRichtung += deltaX / 100
                        .KameraVerhaeltnisWeite += deltaY / 100

                        'System.Windows.Forms.Cursor.Position = New Point(Hauptmenue.ScrollenX, Hauptmenue.ScrollenY) + Hauptmenue.MainMenue.Location
                        Hauptmenue.ScrollenX = ObjektMaus.XKoordinate
                        Hauptmenue.ScrollenY = ObjektMaus.YKoordinate
                    End With
                End If
            End If
        End If
        If Hauptmenue.Scrollen = True Then
            If DataSettings.draw3D Or DataSettings._2D_3D_Malen Then
                Dim deltaX As Integer = ObjektMaus.XKoordinate - Hauptmenue.ScrollenX
                Dim deltaY As Integer = ObjektMaus.YKoordinate - Hauptmenue.ScrollenY
                Hauptmenue.ScrollenX = ObjektMaus.XKoordinate
                Hauptmenue.ScrollenY = ObjektMaus.YKoordinate
                With Objektverwalter.Spielfeld
                    Dim Richtungsvector As New Vector3(-Math.Sin(.KameraRichtung), 0, -Math.Cos(.KameraRichtung))
                    .KameraTarget = Vector3.Add(.KameraTarget, Vector3.Multiply(Richtungsvector, deltaY / 70))
                    .KameraTarget = Vector3.Add(.KameraTarget, Vector3.Multiply(Vector3.Cross(Richtungsvector, New Vector3(0, 1, 0)), deltaX / 100))
                End With

                ' Objektverwalter.Spielfeld.KameraTarget = New Microsoft.DirectX.Vector3(Objektverwalter.Spielfeld.KameraTarget.X + deltaX / 100, 0, Objektverwalter.Spielfeld.KameraTarget.Z + deltaY / 100)
            Else
                Hauptmenue.Scroller(ObjektMaus.XKoordinate - Hauptmenue.ScrollenX, ObjektMaus.YKoordinate - Hauptmenue.ScrollenY)
                ' If Objektverwalter.Spielfeld.CurrentAI Is Nothing Then
                Hauptmenue.ScrollenX = ObjektMaus.XKoordinate
                Hauptmenue.ScrollenY = ObjektMaus.YKoordinate
                'End If
            End If
        End If
    End Sub

    Public Shared Sub Scroller(ByVal X As Integer, ByVal Y As Integer)
        If X < 10 And X > -10 And Y < 10 And Y > -10 Then
            Exit Sub
        End If

        Dim AdditionX As Integer = 1
        If X < 0 Then
            X = X * -1
            AdditionX = -1
        End If
        Dim AdditionY As Integer = 1
        If Y < 0 Then
            Y = Y * -1
            AdditionY = -1
        End If
        Dim Xneu As Integer = Objektverwalter.Spielfeld.BildschirmKooX
        Dim Yneu As Integer = Objektverwalter.Spielfeld.BildschirmKooY
        'Dann schauen wir wie weit wir scrollen koennen
        For I = 1 To X
            If Not Xneu + AdditionX * DataSettings.ScrollEmpfindlichkeit * DataSettings.MausUmkehren > Rechteck.X + DataSettings.BildschirmBreite - Hauptmenue.Feldbreite And Xneu + AdditionX * DataSettings.ScrollEmpfindlichkeit * DataSettings.MausUmkehren + DataSettings.BildschirmBreite - 2 * Hauptmenue.Feldbreite > (Objektverwalter.Spielfeld.Breite + 1) * (Feldbreite) * -1 + DataSettings.BildschirmBreite - (DataSettings.BildschirmBreite - Rechteck.Width) + Hauptmenue.Feldbreite + Rechteck.X Then
                Xneu += AdditionX * DataSettings.ScrollEmpfindlichkeit * DataSettings.MausUmkehren
            Else
                Exit For
            End If
        Next
        For I2 = 1 To Y
            If Not Yneu + AdditionY * DataSettings.ScrollEmpfindlichkeit * DataSettings.MausUmkehren > Rechteck.Y + DataSettings.BildschirmHoehe - Hauptmenue.Feldbreite And Yneu + AdditionY * DataSettings.ScrollEmpfindlichkeit * DataSettings.MausUmkehren + DataSettings.BildschirmHoehe - 2 * Hauptmenue.Feldbreite > (Objektverwalter.Spielfeld.Hoehe + 1) * (Feldbreite) * -1 + DataSettings.BildschirmHoehe - (DataSettings.BildschirmHoehe - Rechteck.Height) + Hauptmenue.Feldbreite + Rechteck.Y Then
                Yneu += AdditionY * DataSettings.ScrollEmpfindlichkeit * DataSettings.MausUmkehren
            Else
                Exit For
            End If
        Next
        'Jetzt wird gescrollt
        Objektverwalter.Spielfeld.BildschirmKooX = Xneu
        Objektverwalter.Spielfeld.BildschirmKooY = Yneu
    End Sub
    Private Shared Sub FramesSpielfeldAktualisieren()
        Dim AnzahlSchlachten As Integer = 0
        ObjektLandschaft.Frame = 1
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        Objektverwalter.Spielfeld.SpielfeldLocker.Lock()
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Objektverwalter.Spielfeld.Einheiten(X, Y, I) IsNot Nothing Then
                        Objektverwalter.Spielfeld.Einheiten(X, Y, I).Frame = 1
                    End If
                    If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude IsNot Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Frame = 1
                    End If
                Next
            Next
        Next
        Objektverwalter.Spielfeld.SpielfeldLocker.Unlock()
    End Sub
    ''' <summary>
    ''' Aktualiesiert alle Bilder die sich bewegen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub FramesAktualisieren()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.Frame = 1
            Objektverwalter.Spielfeld.Wetterframe = 1
            FramesSpielfeldAktualisieren()
        End If
        ObjektMaus.Frame = 1
        Objektverwalter.FrameMarkierteFelder = 1
    End Sub


    Public Shared Sub SetSpielfeldpunkt(ByVal X As Integer, ByVal Y As Integer)
        Dim P As Point = SpielfeldPunkt
        If DataSettings.draw3D Then
            'So bei 3D, sieht das aber anders aus!
            If Objektverwalter.Spielfeld Is Nothing Then
                X = -1
                Y = -1
            Else
                'With Objektverwalter.Spielfeld
                '    Dim V As Vector3
                '    V.Unproject(Grafikengine.Grafikkarte.Viewport, Grafikengine.Grafikkarte.Transform.Projection, Grafikengine.Grafikkarte.Transform.View, Grafikengine.Grafikkarte.Transform.World)
                'End With
                P = Grafikengine.Intersect(X, Y)
                X = P.X
                Y = P.Y
            End If
            Grafikengine.setLichtPos(New Vector3(X, 2, -Y))
            'ElseIf DataSettings._2D_3D_Malen
        ElseIf DataSettings._2D_3D_Malen Then
            If Objektverwalter.Spielfeld Is Nothing Then
                X = -1
                Y = -1
            Else
                P = Grafikengine.Intersect2D(X, Y)
                X = P.X
                Y = P.Y
            End If
        Else
            '2D:
            If IsNothing(Objektverwalter.Spielfeld) = False Then
                X -= Objektverwalter.Spielfeld.BildschirmKooX
                Y -= Objektverwalter.Spielfeld.BildschirmKooY
            Else
                X = -Feldbreite
                Y = -Feldbreite
            End If
            X = X / Feldbreite
            Y = Y / Feldbreite
        End If
        SpielfeldPunkt = New Point(X, Y)
        If Formmodus = Formmodi.Spiel Then
            Dim M As ObjektSpielMenue = Objektverwalter.Menue

            If DataSettings.CursorImSpielBleiben Then
                'Wir sorgen dafuer das der Cursor auf dem Bildschirm bleibt
                If M.Spielmodus <> ObjektSpielMenue.Spielmodi.AuswahlmenueEinheit Then
                    Dim Changed As Boolean = False
                    If SpielfeldPunkt.X < 0 Then
                        Changed = True
                        SpielfeldPunkt.X = 0
                    End If
                    If SpielfeldPunkt.X > Objektverwalter.Spielfeld.Breite - 1 Then
                        Changed = True
                        SpielfeldPunkt.X = Objektverwalter.Spielfeld.Breite - 1
                    End If
                    If SpielfeldPunkt.Y < 0 Then
                        Changed = True
                        SpielfeldPunkt.Y = 0
                    End If
                    If SpielfeldPunkt.Y > Objektverwalter.Spielfeld.Hoehe - 1 Then
                        Changed = True
                        SpielfeldPunkt.Y = Objektverwalter.Spielfeld.Hoehe - 1
                    End If
                    If Changed Then
                        CursorPlazieren(SpielfeldPunkt.X * Feldbreite, SpielfeldPunkt.Y * Feldbreite)
                    End If
                End If
            End If
            If M.Spielmodus = ObjektSpielMenue.Spielmodi.Abzug Or M.Spielmodus = ObjektSpielMenue.Spielmodi.Einheitausgewaehlt Or M.Spielmodus = ObjektSpielMenue.Spielmodi.FeuerradiusAnzeigen Or M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts Then
                If Not P.X = SpielfeldPunkt.X Then
                    If Rechteck.Contains(SpielfeldPunkt.X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, SpielfeldPunkt.Y * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY) Then
                        '  My.Computer.Audio.Play(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", AudioPlayMode.Background)
                    End If
                ElseIf Not P.Y = SpielfeldPunkt.Y Then
                    If Rechteck.Contains(SpielfeldPunkt.X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, SpielfeldPunkt.Y * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY) Then
                        ' My.Computer.Audio.Play(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", AudioPlayMode.Background)
                    End If
                End If
            End If
            M.SPSchadenAnzeigen()
        End If
    End Sub

    Public Shared Sub StartCreatingObjects()
        PauseFuerObjekteLaden = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
    End Sub
    Public Shared Sub EndCreatingObjects()
        PauseFuerObjekteLaden = False
    End Sub
#End Region
#Region "Formevents"
    Public Shared Sub Reset()
        'Kartenauswahl wird auf Null gesetzt
        Rechteck = New Rectangle(0, 0, DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
        If Not Objektverwalter.Menue Is Nothing Then
            Objektverwalter.Menue.Reset()
        End If
        Objekt2D.Reset()
    End Sub


    Public Sub Hauptmenue_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Pause = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        If Grafikengine.Grafikkarte IsNot Nothing Then
            Grafikengine.Grafikkarte.Dispose()
        End If
        Grafikengine.Grafikkarte = Nothing

        If Hauptmenue.AufzeichnungAktiv Then
            AufzeichnungAbspielenThreadBeenden()
        End If
        If Objektverwalter.Autosaver IsNot Nothing Then
            Objektverwalter.Autosaver.Abort()
        End If
        If Lobby IsNot Nothing Then
            Lobby.CloseLobby()
        End If

        If Not NoAssemblyFound Then
            'If EngineSprach IsNot Nothing Then
            '    RemoveHandler EngineSprach.SpeechRecognized, AddressOf Spracherkenntnis
            'End If
        End If
        If ObjektLadebildschirm.WaitForPlayersThread IsNot Nothing Then
            ObjektLadebildschirm.WaitForPlayersThread.Abort()
            ObjektLadebildschirm.WaitForPlayersThread = Nothing
        End If
        'Netzwerk schliessen!
        If Hauptmenue.Connection IsNot Nothing Then
            Connection.Close(False)
        End If
        MusikEngine.Dispose()
        If Objektverwalter.Spielfeld IsNot Nothing Then
            If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
                If Objektverwalter.Spielfeld.CurrentAI.KIThreat IsNot Nothing Then
                    Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                    Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
                    Objektverwalter.Spielfeld.CurrentAI = Nothing
                End If
            End If
        End If
        If Hauptmenue.User IsNot Nothing Then
            Hauptmenue.User.SaveData()
        End If
        'Ini Speichern.
        DataSettings.MySettingsIniSave()
    End Sub

    Private Sub Hauptmenue_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If GameIni Then
            If MessageBox.MessageDialogueBox IsNot Nothing Then
                Select Case e.KeyCode
                    Case DataSettings.Screenshot
                        ScreenToPicture()
                End Select
                MessageBox.KeyDown(sender, e)
            Else
                Select Case e.KeyCode
                    Case DataSettings.Bestaetigen
                        VideoKlasse.Abbrechen()
                    Case DataSettings.Screenshot
                        ScreenToPicture()
                End Select
                If Not ErsterStart Then
                    If Not Konsole.KeyDown(e) Then
                        If Not ObjektLadebildschirm.Ladebildschirm Is Nothing Then
                            ObjektLadebildschirm.Ladebildschirm.KeyDown(sender, e)
                        ElseIf Not Objektverwalter.Menue Is Nothing Then
                            Objektverwalter.Menue.KeyDown(sender, e)
                        End If
                    End If
                End If
            End If
        End If
    End Sub
    Private Shared Sub Hauptmenue_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        If GameIni Then
            If MessageBox.MessageDialogueBox IsNot Nothing Then
                MessageBox.MouseDown(sender, e)
            Else
                If Not ErsterStart Then
                    If Not ObjektLadebildschirm.Ladebildschirm Is Nothing Then
                        ObjektLadebildschirm.Ladebildschirm.MouseDown(sender, e)
                    ElseIf Not Objektverwalter.Menue Is Nothing Then
                        Objektverwalter.Menue.MouseDown(sender, New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta))
                    End If
                End If
            End If
        End If
    End Sub
    Private Sub MalPanel_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
        Cursor.Hide()
    End Sub
    Private Sub MalPanel_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
        Cursor.Show()
    End Sub
    Private Shared Sub Hauptmenue_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        ObjektMaus.SetCursorPosition(e.Location)
        If MessageBox.MessageDialogueBox IsNot Nothing Then
            MessageBox.MouseMove(sender, e)
        Else
            If Not ObjektLadebildschirm.Ladebildschirm Is Nothing Then
                ObjektLadebildschirm.Ladebildschirm.MouseMove(sender, e)
            ElseIf Not Objektverwalter.Menue Is Nothing Then
                Objektverwalter.Menue.MouseMove(sender, e)
            End If
        End If
    End Sub
    Private Shared Sub Hauptmenue_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        If GameIni Then
            If MessageBox.MessageDialogueBox IsNot Nothing Then
                MessageBox.MouseUp(sender, e)
            Else
                If Not ErsterStart Then
                    If Not ObjektLadebildschirm.Ladebildschirm Is Nothing Then
                        ObjektLadebildschirm.Ladebildschirm.MouseUp(sender, e)
                    ElseIf Not Objektverwalter.Menue Is Nothing Then
                        Objektverwalter.Menue.MouseUp(sender, New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta))
                    End If
                End If
            End If
        End If
    End Sub
    Private Sub Hauptmenue_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If GameIni Then
            If Not ErsterStart Then
                If Not ObjektLadebildschirm.Ladebildschirm Is Nothing Then
                    ObjektLadebildschirm.Ladebildschirm.KeyUp(sender, e)
                ElseIf Not Objektverwalter.Menue Is Nothing Then
                    Objektverwalter.Menue.KeyUp(sender, e)
                End If
            End If
        End If
    End Sub
    Private Shared Sub Hauptmenue_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
        If Not Objektverwalter.Menue Is Nothing Then Objektverwalter.Menue.MouseWheel(sender, New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta))
        If Not ObjektLadebildschirm.Ladebildschirm Is Nothing Then ObjektLadebildschirm.Ladebildschirm.MouseWheel(sender, e)
    End Sub
    Public Shared Sub CursorPlazieren(ByVal P As Point, Optional ByVal _2DPosition As Boolean = False)
        CursorPlazieren(P.X, P.Y, _2DPosition)
    End Sub
    Public Shared Sub CursorPlazieren(ByVal X As Integer, ByVal Y As Integer, Optional ByVal _2DPosition As Boolean = False, Optional ByVal DuringDrawing As Boolean = False)
        If (DataSettings.draw3D Or DataSettings._2D_3D_Malen) And Not _2DPosition Then
            If Not Hauptmenue.AufzeichnungAbspielen Then

                X /= Hauptmenue.Feldbreite : Y /= Hauptmenue.Feldbreite
                Dim P As Point = Grafikengine.WorldSpaceToScreenSpace(New Vector3(X + 0.5, 0, -Y + 0.5))
                Dim P2 As New Point
                If Objektverwalter.Spielfeld.CurrentAI Is Nothing Then
                    If DataSettings.Fenstermodus Then
                        P2 = New Point(Hauptmenue.Rand.X, Hauptmenue.Rand.Y)
                    End If
                    Cursor.Position = P + Hauptmenue.MainMenue.Location + P2
                End If
                SetSpielfeldpunkt(P.X + P2.X, P.Y + P2.Y)
                Objektverwalter.Menue.MouseMove(Nothing, New System.Windows.Forms.MouseEventArgs(Windows.Forms.MouseButtons.None, 0, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, 0))
            End If
        Else
            If Not Hauptmenue.AufzeichnungAbspielen Then
                X += Objektverwalter.Spielfeld.BildschirmKooX : Y += Objektverwalter.Spielfeld.BildschirmKooY
                If DataSettings.Fenstermodus Then
                    X += Hauptmenue.Rand.X
                    Y += Hauptmenue.Rand.Y
                End If
                If Objektverwalter.Spielfeld.CurrentAI Is Nothing Then
                    Cursor.Position = New Point(X, Y) + Hauptmenue.MainMenue.Location
                End If
                SetSpielfeldpunkt(X, Y)
                Objektverwalter.Menue.MouseMove(Nothing, New System.Windows.Forms.MouseEventArgs(Windows.Forms.MouseButtons.None, 0, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, 0))
            End If
        End If

    End Sub
    Public Shared Sub MoveCursorByKeyOutsideMap(ByVal XVeraenderung As Integer, ByVal YVeraenderung As Integer)
        Dim found As Boolean = False
        Dim AntiEnd As Boolean = False
        Dim XMaus As Integer
        Dim YMaus As Integer
        Dim P As Point
        XMaus = ObjektMaus.XKoordinate
        YMaus = ObjektMaus.YKoordinate
        While Not found
            XMaus += XVeraenderung
            YMaus += YVeraenderung
            If XMaus > DataSettings.BildschirmBreite And Not AntiEnd Then
                XMaus = 0
                AntiEnd = True
            ElseIf XMaus > DataSettings.BildschirmBreite Then
                P = New Point
                Exit While
            End If
            If YMaus > DataSettings.BildschirmHoehe And Not AntiEnd Then
                YMaus = 0
                AntiEnd = True
            ElseIf YMaus > DataSettings.BildschirmHoehe Then
                P = New Point
                Exit While
            End If
            If XMaus < 0 And Not AntiEnd Then
                AntiEnd = True
                XMaus = DataSettings.BildschirmBreite
            ElseIf XMaus < 0 Then
                P = New Point
                Exit While
            End If
            If YMaus < 0 And Not AntiEnd Then
                AntiEnd = True
                YMaus = DataSettings.BildschirmHoehe
            ElseIf YMaus < 0 Then
                P = New Point
                Exit While
            End If
            P = Grafikengine.Intersect2D(XMaus, YMaus)
            If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Hoehe Then
                found = True
            End If
        End While
        Hauptmenue.CursorPlazieren(P.X * Hauptmenue.Feldbreite, P.Y * Hauptmenue.Feldbreite)
    End Sub


    Public Shared Sub AktualisierenTaskbar()
        Select Case DataSettings.TaskAnzeigenModus
            Case TaskleistenAnzeige.Taskleiste
                MainMenue.NICommanderWars.Visible = False
                MainMenue.ShowInTaskbar = True
            Case TaskleistenAnzeige.TrayMenue
                MainMenue.NICommanderWars.Visible = True
                MainMenue.ShowInTaskbar = False
            Case TaskleistenAnzeige.Versteckt
                MainMenue.NICommanderWars.Visible = False
                MainMenue.ShowInTaskbar = False
        End Select
    End Sub
    Private Sub NICommanderWars_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles NICommanderWars.Click
        MainMenue.Activate()
        Visible = True
    End Sub
#End Region
#Region "Speichern und Laden"
    Public Shared Sub SpeichernUnterName()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.SaveDialog, Sprachconverter.Translate("Karte Speichern Unter"), DataSettings.Resourcenpfad + "Maps\", New String() {"Commander Wars " + Sprachconverter.Translate("Karte") + " ; *.map"}, Objektverwalter.Spielfeld.Kartenname + ".map") = Windows.Forms.DialogResult.OK Then
            Dim Name As String = MessageBox.CurrentFile
            Speichern(Name, , , True)
        End If
    End Sub
    Public Shared Sub SpielstandSpeichern()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.SaveDialog, Sprachconverter.Translate("Spielstand Speichern"), DataSettings.Resourcenpfad + "Savegames\", New String() {"Commander Wars " + Sprachconverter.Translate("Karte") + " ; *.sav"}, Objektverwalter.Spielfeld.Kartenname + ".map") = Windows.Forms.DialogResult.OK Then
            Dim Name As String = MessageBox.CurrentFile
            If Name.LastIndexOf("\") >= 0 Then
                Name = Name.Remove(0, Name.LastIndexOf("\") + 1)
            End If
            If Name.IndexOf(".") >= 0 Then
                Name = Name.Remove(Name.IndexOf("."))
            End If
            Speichern(Name, ".sav")
        End If
    End Sub
    Public Shared Sub KarteLadenEditor()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.OpenDialog, Sprachconverter.Translate("Karte laden"), DataSettings.Resourcenpfad + "Maps\", New String() {"Commander Wars " + Sprachconverter.Translate("Karte") + " ; *.map"}) = Windows.Forms.DialogResult.OK Then
            If My.Computer.FileSystem.FileExists(MessageBox.CurrentFile) Then
                'Jetzt Laden wir die Karte im Editor
                Dim Name As String = MessageBox.CurrentFile
                Dim Endung As String = "map"
                If Name.LastIndexOf("\") >= 0 Then
                    If Name.LastIndexOf(".") >= 0 Then
                        Laden(Name, True, "")
                    Else
                        Laden(Name, True)
                    End If
                Else
                    Laden(Name, False)
                End If
            End If
            Objektverwalter.Spielfeld.IniCamera()
            Dim M As ObjektKarteneditormenue = Objektverwalter.Menue
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If
    End Sub
    Public Shared Sub KarteLadenEditorausTXT()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.OpenDialog, Sprachconverter.Translate("Karte importieren"), DataSettings.Resourcenpfad + "Maps\", New String() {"Commander Wars " + Sprachconverter.Translate("Karte") + " ; *.txt"}) = Windows.Forms.DialogResult.OK Then
            If My.Computer.FileSystem.FileExists(MessageBox.CurrentFile) Then
                'Jetzt Laden wir die Karte im Editor
                Dim Name As String = MessageBox.CurrentFile
                Objektverwalter.Spielfeld = LoadMapOutOfTxt(Name, True, True, True)
                GenerateUnitIDs()
                Objektverwalter.UebergaengeAktualiesieren()
                Objektverwalter.Zentrieren()
            End If
            Dim M As ObjektKarteneditormenue = Objektverwalter.Menue
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If
    End Sub
    ''' <summary>
    ''' Importiert eine ausgewaehlte AW DS Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub KarteLadenEditorausAWSMap()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.OpenDialog, Sprachconverter.Translate("Karte importieren"), DataSettings.Resourcenpfad + "Maps\", New String() {"AW DS " + Sprachconverter.Translate("Karte") + " ; *.aws"}) = Windows.Forms.DialogResult.OK Then
            If My.Computer.FileSystem.FileExists(MessageBox.CurrentFile) Then
                'Jetzt Laden wir die Karte im Editor
                Dim Name As String = MessageBox.CurrentFile
                ObjektKarteneditormenue.ImportAWSMap(Name)
                GenerateUnitIDs()
                Objektverwalter.UebergaengeAktualiesieren()
                Objektverwalter.Zentrieren()
            End If
            Dim M As ObjektKarteneditormenue = Objektverwalter.Menue
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If
    End Sub
    ''' <summary>
    ''' Exportiert eine ausgewaehlte AW DS Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub KarteExportierenEditorausAWSMap()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.SaveDialog, Sprachconverter.Translate("Karte exportieren"), DataSettings.Resourcenpfad + "Maps\", New String() {"AW DS " + Sprachconverter.Translate("Karte") + " ; *.aws"}) = Windows.Forms.DialogResult.OK Then
            'Jetzt Laden wir die Karte im Editor
            Dim Name As String = MessageBox.CurrentFile
            ObjektKarteneditormenue.ExportAWSMap(Name)
        End If
    End Sub
    ''' <summary>
    ''' Importiert eine ausgewaehlte AW DC Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub KarteLadenEditorausAW4Map()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.OpenDialog, Sprachconverter.Translate("Karte importieren"), DataSettings.Resourcenpfad + "Maps\", New String() {"AW DC\DoR " + Sprachconverter.Translate("Karte") + " ; *.aw4"}) = Windows.Forms.DialogResult.OK Then
            If My.Computer.FileSystem.FileExists(MessageBox.CurrentFile) Then
                'Jetzt Laden wir die Karte im Editor
                Dim Name As String = MessageBox.CurrentFile
                ObjektKarteneditormenue.ImportAW4Map(Name)
                GenerateUnitIDs()
                Objektverwalter.UebergaengeAktualiesieren()
                Objektverwalter.Zentrieren()
            End If
            Dim M As ObjektKarteneditormenue = Objektverwalter.Menue
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If
    End Sub
    ''' <summary>
    ''' Exportiert eine ausgewaehlte AW DC Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub KarteExportierenEditorausAW4Map()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.SaveDialog, Sprachconverter.Translate("Karte exportieren"), DataSettings.Resourcenpfad + "Maps\", New String() {"AW DC " + Sprachconverter.Translate("Karte") + "|*.aw4"}) = Windows.Forms.DialogResult.OK Then
            'Jetzt Laden wir die Karte im Editor
            Dim Name As String = MessageBox.CurrentFile
            ObjektKarteneditormenue.ExportAW4Map(Name)
        End If
    End Sub
    Public Shared Sub KarteausBildLadenEditor()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.OpenDialog, Sprachconverter.Translate("Karte importieren"), DataSettings.Resourcenpfad + "Maps\", New String() {"Pictures ; *.png ; *.bmp"}) = Windows.Forms.DialogResult.OK Then
            Objektverwalter.Spielfeld = KarteAusBildLaden(MessageBox.CurrentFile)
            Objektverwalter.Zentrieren()
            Objektverwalter.UebergaengeAktualiesieren()
            Dim M As ObjektKarteneditormenue = Objektverwalter.Menue
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If

    End Sub
    Public Shared Sub KarteExportieren()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.SaveDialog, Sprachconverter.Translate("Karte Exportieren"), DataSettings.Resourcenpfad + "Maps\", New String() {"Commander Wars " + Sprachconverter.Translate("Karte") + " ; *.txt"}, Objektverwalter.Spielfeld.Kartenname + ".txt") = Windows.Forms.DialogResult.OK Then
            Dim Name As String = MessageBox.CurrentFile
            If Name.IndexOf(".") < 0 Then
                Name += ".txt"
            End If
            SaveAsTxt(Name, Objektverwalter.Spielfeld)
        End If
    End Sub
    ''' <summary>
    ''' Spielfeld wird gespeichert
    ''' </summary>
    ''' <param name="Name">Nur Dateiname, ohne Endung oder Ueberordner</param>
    ''' <param name="Endung">Karte: ".map" | Speicherstaende: ".sav"</param>
    ''' <remarks></remarks>
    Public Shared Sub Speichern(ByVal Name As String, Optional ByVal Endung As String = ".map", Optional ByVal Spielfeld As ObjektSpielfeld = Nothing, Optional ByVal KompletterPfad As Boolean = False, Optional ByVal OldVersion As Boolean = False)
        If Spielfeld Is Nothing Then
            Spielfeld = Objektverwalter.Spielfeld
        End If
        Dim Pfad As String = Name
        If Name.ToLower.EndsWith(".map") Or Name.ToLower.EndsWith(".sav") Or Name.ToLower.EndsWith(".txt") Then
            Name = Name.Remove(Name.Length - 4)
        End If
        If Name.Contains("\") Then
            Name = Name.Remove(0, Name.LastIndexOf("\") + 1)
        End If
        If Endung = ".map" Then
            If Spielfeld.Kartenname = "" Or Spielfeld.Kartenname = "Karte" Then
                Spielfeld.Kartenname = Name
            End If
        End If
        If KompletterPfad = False Then
            Pfad = DataSettings.Resourcenpfad + "Maps"
            Pfad = IO.Path.Combine(Pfad, Name + Endung)
        End If

        If Pfad.ToLower.EndsWith(".sav") Then Pfad = Pfad.Replace("\Maps\", "\Savegames\")

        If AufzeichnungAktiv Then
            AufzeichnungSichern(Pfad.Replace("\Savegames\", "\Record\active\").Replace(".sav", ".rpl"))
            Spielfeld.MapPosition = Pfad.Replace("\Savegames\", "\Record\active\").Replace(".sav", ".rpl")
        End If
        'Bei Spielstaenden sollte die Landschaften fest gemacht werden. Klasse Deutsch Was?
        If Endung = ".sav" Then
            For I = 0 To 1
                For X = 0 To Spielfeld.Breite - 1
                    For Y = 0 To Spielfeld.Hoehe - 1
                        Spielfeld.Landschaften(X, Y, I).BildIDFest = True
                    Next
                Next
            Next
        End If
        If OldVersion Then
            Using Stream As New IO.FileStream(Pfad, IO.FileMode.Create, IO.FileAccess.Write)
                Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                Konverter.Serialize(Stream, Spielfeld)
            End Using
        Else
            SaveMap(Pfad, Endung, Spielfeld, KompletterPfad)
        End If
        If Endung = ".sav" Then
            DataSettings.LetztesSpiel = Pfad
            DataSettings.MySettingsIniSave()
        End If
    End Sub
    ''' <summary>
    ''' Laedt ein Spielfeld und uebergibt es an den Objektverwalter
    ''' Note: Wenn diese Karte geladen wird um sie weiter zu spielen muss:   Objektverwalter.Spielfeld.SpielWiederaufnehmen() aufegerufen werden.
    ''' </summary>
    ''' <param name="Name"></param>
    ''' <param name="GesamterName"></param>
    ''' <param name="Endung"></param>
    ''' <remarks></remarks>
    ''' 
    Public Shared Sub Laden(ByVal Name As String, ByVal GesamterName As Boolean, Optional ByVal Endung As String = ".map", Optional ByVal TexturenLaden As Boolean = True, Optional ByVal UpdateframeStarten As Boolean = True, Optional ByVal SpeicherStand As Boolean = False)
        Pause = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        Dim neuesSpielfeld As ObjektSpielfeld = Nothing
        Dim Pfad As String = Name
        If Name(1) <> ":" Then
            Pfad = DataSettings.Resourcenpfad + "Savegames\"
        Else
            Pfad = ""
        End If
        If Not ((Name.ToLower.EndsWith(".map")) Or (Name.ToLower.EndsWith(".sav"))) Then
            If My.Computer.FileSystem.FileExists(Pfad + Name + Endung) Then
                Pfad += Name + Endung
            Else
                Pfad += Name.Trim + Endung
            End If
        Else
            Pfad += Name
        End If
        If GesamterName Then

            Dim S() As String = Name.Split(".")
            Endung = "." + S(S.Length - 1)
        End If

        Dim BilderNeuLaden As Boolean = False
        If My.Computer.FileSystem.FileExists(Pfad) Then
            Dim Loaded As Boolean = False
            Using Stream As New IO.FileStream(Pfad, IO.FileMode.Open, IO.FileAccess.Read)
                Try
                    Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                    neuesSpielfeld = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                    Loaded = True
                Catch
                    Loaded = False
                End Try
            End Using
            If Not Loaded Then
                neuesSpielfeld = LoadMap(Pfad)
                If neuesSpielfeld Is Nothing Then
                    Konsole.Write("Error: Unable to load Map :" + Pfad + " !")
                    Exit Sub
                End If
            End If
            Dim CFarbe As Color = Nothing
            For I = 0 To neuesSpielfeld.Spieler.Length - 1
                If neuesSpielfeld.Spieler(I).Farbe = CFarbe Then
                    If I = 0 Then
                        neuesSpielfeld.Spieler(I).Farbe = Hauptmenue.SpielerNeutral
                    Else
                        Dim Z As Integer = I
                        While Z > AlleFarbtabellen.Length
                            Z -= AlleFarbtabellen.Length
                        End While

                        neuesSpielfeld.Spieler(I).Farbe = GetFarbtabelle(Z - 1)
                    End If
                End If
            Next
            'Damit der Ladebildschirm richtig funktioniert
            If Endung.ToLower = ".sav" Then
                If neuesSpielfeld.GetCommanderWarsModus <> DataSettings.CommanderWarsGameModus Then
                    'Wir muessen erst mal die Grafiken richtig laden.
                    DataSettings.CommanderWarsGameModus = neuesSpielfeld.GetCommanderWarsModus
                    Objektverwalter.LoadNewGameModus(DataSettings.TerrainStyle)
                    BilderNeuLaden = True
                End If
                ObjektLadebildschirm.SetBrechreibung(neuesSpielfeld.Beschreibung)
            Else
                Dim Lng As Sprachen = DataSettings.Sprache
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Language\" + Lng.ToString + "\Maps.lng") Then
                    Using StrR As New IO.StreamReader(DataSettings.Resourcenpfad + "Language\" + Lng.ToString + "\Maps.lng", Hauptmenue.Codierung)
                        While Not StrR.EndOfStream
                            Dim L As String = StrR.ReadLine
                            If Not L.StartsWith("'") Then
                                If Not L.StartsWith("//") Then
                                    If L.ToLower.StartsWith(neuesSpielfeld.Kartenname.ToLower + "=") Then
                                        neuesSpielfeld.Kartenname = L.Split("=")(1)
                                        Exit While
                                    End If
                                End If
                            End If
                        End While
                    End Using
                End If
                neuesSpielfeld.MapPosition = Pfad
            End If
            'Eigene Verweise werden generiert
            Objektverwalter.MarkierteFelder.Clear()
            ReDim neuesSpielfeld.Animationen(-1)

            If Objektverwalter.Spielfeld Is Nothing Or BilderNeuLaden Then
                'Wir muessen alle Texturen laden.

                For I = 0 To neuesSpielfeld.Spieler.Length - 1
                    If TexturenLaden = True Then
                        neuesSpielfeld.Spieler(I).Spieler = I
                        If IsNothing(neuesSpielfeld.Spieler(I).KOS) = False Then
                            For I2 = 0 To neuesSpielfeld.Spieler(I).KOS.Length - 1
                                If IsNothing(neuesSpielfeld.Spieler(I).KOS(I2)) = False Then
                                    If TypeOf neuesSpielfeld.Spieler(I).KOS(I2) Is KOClone Then
                                        neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten, CType(neuesSpielfeld.Spieler(I).KOS(I2), KOClone).KOBild)
                                    Else
                                        neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten)
                                    End If

                                End If
                            Next
                        End If
                    Else
                        If IsNothing(neuesSpielfeld.Spieler(I).KOS) = False Then
                            For I2 = 0 To neuesSpielfeld.Spieler(I).KOS.Length - 1
                                If IsNothing(neuesSpielfeld.Spieler(I).KOS(I2)) = False Then
                                    If TypeOf neuesSpielfeld.Spieler(I).KOS(I2) Is KOClone Then
                                        neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten, CType(neuesSpielfeld.Spieler(I).KOS(I2), KOClone).KOBild)
                                    Else
                                        neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten)
                                    End If
                                End If
                            Next
                        End If
                    End If
                Next
            Else
                'Texturen laden
                For I = 0 To neuesSpielfeld.Spieler.Length - 1
                    If TexturenLaden = True Then
                        neuesSpielfeld.Spieler(I).Spieler = I
                        If IsNothing(neuesSpielfeld.Spieler(I).KOS) = False Then
                            For I2 = 0 To neuesSpielfeld.Spieler(I).KOS.Length - 1
                                If IsNothing(neuesSpielfeld.Spieler(I).KOS(I2)) = False Then
                                    If TypeOf neuesSpielfeld.Spieler(I).KOS(I2) Is KOClone Then
                                        neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten, CType(neuesSpielfeld.Spieler(I).KOS(I2), KOClone).KOBild)
                                    Else
                                        neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten)
                                    End If
                                End If
                            Next
                        End If
                    Else
                        If IsNothing(neuesSpielfeld.Spieler(I).KOS) = False Then
                            For I2 = 0 To neuesSpielfeld.Spieler(I).KOS.Length - 1
                                If IsNothing(neuesSpielfeld.Spieler(I).KOS(I2)) = False Then
                                    If TypeOf neuesSpielfeld.Spieler(I).KOS(I2) Is KOClone Then
                                        neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten, CType(neuesSpielfeld.Spieler(I).KOS(I2), KOClone).KOBild)
                                    Else
                                        neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten)
                                    End If
                                End If
                            Next
                        End If
                    End If
                Next
            End If
            If neuesSpielfeld.Hoehe = 0 Then
                neuesSpielfeld.Hoehe = neuesSpielfeld.Landschaften.GetLength(1)
                Speichern(Pfad, , neuesSpielfeld, True)
            End If
            'Das neueSpielfeld wird uebergeben
            Objektverwalter.Spielfeld = neuesSpielfeld

            'Editor erstellen
            If Not Formmodus = Formmodi.Editor And Grafikengine.Grafikkarte IsNot Nothing Then
                Objektverwalter.Spielfeld.InfoAnzeige = New ObjektInfoAnzeige()
            End If
            'KO Anzeige erstellen
            If Not TypeOf Objektverwalter.Menue Is ObjektKarteneditormenue Then
                If IsNothing(Objektverwalter.Spielfeld.AktuellerSpieler) = False Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.KOS IsNot Nothing Then
                        Objektverwalter.Spielfeld.KOAnzeigen = New ObjektKOAnzeigen()
                        Objektverwalter.Spielfeld.KOAnzeigen.KOAnzeigeerstellen()
                    End If
                End If
            End If
            'Landschaften und Einheiten erstellen
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    For I = 0 To Objektverwalter.Spielfeld.Landschaften.GetLength(2) - 1
                        Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                        Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(X, Y, I)
                        Objektverwalter.Spielfeld.Landschaften(X, Y, I) = New ObjektLandschaft(Objektverwalter.Spielfeld.Landschaften(X, Y, I).LandschaftsID, X, Y, Objektverwalter.Spielfeld, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude)
                        Objektverwalter.Spielfeld.Landschaften(X, Y, I).RestoreLandschaft(L)

                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                            If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.GetRealGebaeudeID = "VERWEIS" Then
                                Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude = ObjektLadeklasse.NewGebaeude(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.GebaeudeID, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.KP, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung, X, Y, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Feuerbereit)
                                If SpeicherStand Then
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.KP = G.KP
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.SetFeuerbereit(G.Feuerbereit)
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Reichweite = G.Reichweite
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Schaden = G.Schaden
                                    If TypeOf Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude Is GebaeudeVulkan Then
                                        CType(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude, GebaeudeVulkan).FeuerbrockenProzent = CType(G, GebaeudeVulkan).FeuerbrockenProzent
                                        CType(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude, GebaeudeVulkan).Targets = CType(G, GebaeudeVulkan).Targets
                                    End If
                                Else
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.KP = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.GetMaxLeben
                                End If
                            End If
                        End If
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            Objektverwalter.CloneUnit(X, Y, X, Y, I)
                        End If
                    Next
                Next
            Next

            'Spieler update
            For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten IsNot Nothing Then
                    Dim I2 As Integer = 0
                    While I2 < Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten.Length - 1
                        If Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten(I2).Einheit IsNot Nothing Then
                            Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten(I2).Einheit = Objektverwalter.Spielfeld.Einheiten(Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten(I2).Einheit.X, Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten(I2).Einheit.Y, Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten(I2).Einheit.GetMap)
                            If Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten(I2).Einheit Is Nothing Then
                                'Oh!
                                Objektverwalter.Spielfeld.Spieler(I).RemoveEinheit(I2)
                                I2 -= 1
                            End If
                        Else
                            Objektverwalter.Spielfeld.Spieler(I).RemoveEinheit(I2)
                            I2 -= 1
                        End If
                        I2 += 1
                    End While
                Else
                    ReDim Objektverwalter.Spielfeld.Spieler(I).ExternGezogeneEinheiten(-1)
                End If
            Next


            If Objektverwalter.Spielfeld.Landschaften.GetLength(2) = 1 Then
                'Jetzt generieren wir noch die Luftschlacht
                Objektverwalter.Spielfeld = Objektverwalter.GenerateZufallskarteLuftschlacht(Objektverwalter.Spielfeld)
                'so jetzt ueberschreiben wir noch die Karte damit sie aktualisiert ist.

                ' Speichern(Pfad, ".map") '--> Muss mit Eagle abgestimmt werden.=)
            End If

            'Noch Scriptsachen bereinigen
            If Objektverwalter.Spielfeld.Scripts Is Nothing Then ReDim Objektverwalter.Spielfeld.Scripts(-1)
            ObjektScript.Scripts = Objektverwalter.Spielfeld.Scripts
            For I = 0 To Objektverwalter.Spielfeld.Scripts.Length - 1
                For I2 = 0 To Objektverwalter.Spielfeld.Scripts(I).Bedingungen.Length - 1
                    If TypeOf Objektverwalter.Spielfeld.Scripts(I).Bedingungen(I2) Is ObjektScript.BedingungEinheitZerstoert Then
                        Dim Bed As ObjektScript.BedingungEinheitZerstoert = Objektverwalter.Spielfeld.Scripts(I).Bedingungen(I2)
                        Dim E As ObjektEinheit = Bed.Einheit
                        If E IsNot Nothing Then
                            Dim E2 As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(E.X, E.Y, Bed.Schlacht)
                            If E2 IsNot Nothing Then
                                If E2.Leben = E.Leben And E2.EinheitenID = E.EinheitenID And E2.EinheitenStufe = E.EinheitenStufe _
                                And E2.Munition = E.Munition And E2.Treibstoff = E.Treibstoff Then
                                    Bed.Einheit = E2
                                    Objektverwalter.Spielfeld.Scripts(I).Bedingungen(I2) = Bed
                                    Continue For
                                End If
                            Else
                                For Each Unit In Objektverwalter.Spielfeld.Einheiten
                                    If Not Unit Is Nothing Then
                                        For Each Ladung In Unit.Ladung
                                            If Ladung IsNot Nothing Then
                                                If Ladung.Equals(E) Then
                                                    Bed.Einheit = Ladung
                                                    Objektverwalter.Spielfeld.Scripts(I).Bedingungen(I2) = Bed
                                                    Continue For
                                                End If
                                            End If
                                        Next
                                    End If
                                Next
                            End If
                        End If
                    End If
                Next
            Next

            Objektverwalter.Spielfeld.Sichterstellen(True)
            If Objektverwalter.Spielfeld.Regeln.BauBlockade Then
                Objektverwalter.Spielfeld.AktuellerSpieler.SpielerBaublockade = Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).GetBaublockade(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler)
            End If
            If (Not SpeicherStand) Then
                Objektverwalter.Zentrieren()
            End If
            Objektverwalter.UebergaengeAktualiesieren()
        End If

        If UpdateframeStarten Then
            Hauptmenue.MainMenue.UpdateStart.Start()
        End If

    End Sub
    Public Shared Function KarteDefaultLaden(ByVal Karte As String) As ObjektSpielfeld
        Dim K As ObjektSpielfeld = Nothing
        Dim Loaded As Boolean = False
        If Not Loaded Then
            K = LoadMap(Karte)
            If K Is Nothing Then
                Return Nothing
            End If
        End If
        Dim CFarbe As Color = Nothing
        For I = 0 To K.Spieler.Length - 1
            If K.Spieler(I).Farbe = CFarbe Then
                If I = 0 Then
                    K.Spieler(I).Farbe = Hauptmenue.SpielerNeutral
                Else
                    K.Spieler(I).Farbe = GetFarbtabelle(I - 1)
                End If
            End If
        Next
        If K.Hoehe = 0 Then
            K.Hoehe = K.Landschaften.GetLength(1)
            Speichern(Karte, , K, True)
        End If
        Return K
    End Function
    ''' <summary>
    ''' Laedt eine Karte aus einem Bild, wobei Gebaeude und Einheiten nicht erkannt werden koennen
    ''' </summary>
    ''' <param name="KompletterDateipfad"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KarteAusBildLaden(ByVal KompletterDateipfad As String) As ObjektSpielfeld
        If Not Objektverwalter.Spielfeld Is Nothing Then
            'Wir holen uns erst einmal das Bild
            Dim Bild As Bitmap = Image.FromFile(KompletterDateipfad)
            Dim Spielfeld As ObjektSpielfeld = New ObjektSpielfeld(Bild.Width / 4, Bild.Height / 4, Objektverwalter.Spielfeld.Spieler, Objektverwalter.Spielfeld.Regeln)
            Spielfeld.Kartenname = KompletterDateipfad.Split("\")(KompletterDateipfad.Split("\").Length - 1).Split(".")(0)
            'Wir gehen das gesamte Spielfeld durch
            Dim B() As Bitmap = {}
            Dim Beschreibung() As String = {}
            For Each Datei In My.Computer.FileSystem.GetFiles(DataSettings.Resourcenpfad + "Minimap\")
                If Datei.Split(".")(1) = "bmp" Then
                    Dim S() As String = Datei.Split("\")
                    Dim File As String = S(S.Length - 1)
                    File = File.Split(".")(0)
                    File = File.Split("+")(0)
                    For I = 0 To Objektverwalter.LandschaftenBilder.Length - 1
                        If File.ToUpper = Objektverwalter.LandschaftenBilder(I).ID Then
                            Array.Resize(B, B.Length + 1)
                            Array.Resize(Beschreibung, Beschreibung.Length + 1)
                            B(B.Length - 1) = Image.FromFile(Datei)
                            Beschreibung(Beschreibung.Length - 1) = File.ToUpper
                            Exit For
                        End If
                    Next
                End If
            Next
            For X = 0 To Spielfeld.Breite - 1
                For Y = 0 To Spielfeld.Hoehe - 1
                    'Wir gehen solange durch bis wir die richtige Landschaftgefunden haben.
                    Dim Gefunden As Boolean = False
                    Dim I As Integer = 0
                    Do
                        For X2 = 0 To 3
                            For Y2 = 0 To 3
                                'Wir ueberpruefen die Farbgleichheit
                                Dim C1 As Color = B(I).GetPixel(X2, Y2)
                                Dim C2 As Color = Bild.GetPixel(X * 4 + X2, Y * 4 + Y2)
                                If C1.A + 10 > C2.A And C1.A - 10 < C2.A And C1.R + 10 > C2.R And C1.R - 10 < C2.R And C1.G + 10 > C2.G And C1.G - 10 < C2.G And C1.B + 10 > C2.B And C1.B - 10 < C2.B Then
                                    'Die Farben passen ungefaehr.
                                Else
                                    I += 1
                                    GoTo Weiter
                                End If
                            Next
                        Next
                        Gefunden = True
                        Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(Beschreibung(I), X, Y, Spielfeld)
Weiter:
                        If I >= B.Length Then
                            'Doof das ist ein Gebaeude, damit koennen wir leider nichts Anfangen, deshalb machen wir dort eine Stadt hin.
                            Gefunden = True
                            Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude = New GebaeudeStadt(0, X, Y, Spielfeld)
                        End If
                    Loop While Gefunden = False
                Next
            Next
            Return Spielfeld
        Else
            Return Nothing
        End If
    End Function
    Public Shared Function SelbeFarbtabelle(ByVal Tabelle1 As Bitmap, ByVal Tabelle2 As Bitmap) As Boolean
        For I = 0 To Tabelle1.Width - 1
            If Tabelle1.GetPixel(I, 0).ToArgb <> Tabelle2.GetPixel(I, 0).ToArgb Then
                Return False
            End If
        Next
        Return True
    End Function
#Region "Speichern und Laden in Textdateien"
    Public Shared Sub SaveAsTxt(ByVal Datei As String, ByVal Spielfeld As ObjektSpielfeld)
        If Not Spielfeld Is Nothing Then
            Using Writer As New IO.StreamWriter(Datei, False)
                Writer.WriteLine("Kartenname=" + Spielfeld.Kartenname)
                For I = 1 To Spielfeld.Spieler.Length - 1
                    Writer.WriteLine("Spieler|" + Spielfeld.Spieler(I).FondsproStadt.ToString + "|" + Spielfeld.Spieler(I).Fonds.ToString + "|" + CInt(Spielfeld.Spieler(I).KIStufe).ToString + "|" + Spielfeld.Spieler(I).Fabrikfonds.ToString)
                Next
                Writer.WriteLine("Groesse|" + Spielfeld.Breite.ToString + "|" + Spielfeld.Hoehe.ToString)
                'Wir exportieren nur die Bodenschlacht
                Dim Schlacht As Integer = 0
                For I = 0 To Schlacht
                    For Y = 0 To Spielfeld.Hoehe - 1
                        For X = 0 To Spielfeld.Breite - 1
                            Dim G As ObjektGebaeude = Spielfeld.Landschaften(X, Y, I).Gebaeude
                            Dim T As String = ""
                            If Not G Is Nothing Then
                                If Not G.GetRealGebaeudeID = "VERWEIS" Then
                                    T = ("Gebaeude|" + X.ToString + "|" + Y.ToString + "|" + I.ToString + "|" + G.GebaeudeID + "|" + G.Spieler.ToString + "|" + G.Besetzung.ToString + "|" + G.Feuerladung.ToString + "|" + G.KP.ToString)
                                End If
                            Else
                                T = ("Landschaft|" + X.ToString + "|" + Y.ToString + "|" + I.ToString + "|" + Spielfeld.Landschaften(X, Y, I).LandschaftsID + "|" + Spielfeld.Landschaften(X, Y, I).Leben.ToString)
                            End If
                            If Not T = "" Then
                                Writer.WriteLine(T)
                            End If
                            T = ""
                            Dim E As ObjektEinheit = Spielfeld.Einheiten(X, Y, I)
                            If Not E Is Nothing Then
                                Writer.WriteLine("Einheit|" + X.ToString + "|" + Y.ToString + "|" + I.ToString + "|" + E.EinheitenID + "|" + E.Munition.ToString + "|" + E.Treibstoff.ToString + "|" + E.getKP.ToString + "|" + E.Spieler.ToString)
                                For I3 = 0 To E.Ladung.Length - 1
                                    If E.Ladung(I3) IsNot Nothing Then
                                        Writer.WriteLine("TEinheit|" + X.ToString + "|" + Y.ToString + "|" + I.ToString + "|" + E.Ladung(I3).EinheitenID + "|" + E.Ladung(I3).Munition.ToString + "|" + E.Ladung(I3).Treibstoff.ToString + "|" + E.Ladung(I3).getKP.ToString + "|" + E.Ladung(I3).Spieler.ToString)
                                    End If
                                Next
                            End If

                            If Not T = "" Then
                                Writer.WriteLine(T)
                            End If
                        Next
                    Next
                Next
            End Using
        End If
    End Sub
    Public Shared Function LoadMapOutOfTxt(ByVal Datei As String, ByVal KampfanimationenLaden As Boolean, ByVal EineitenTexturenLaden As Boolean, ByVal GebaeudeTexturenLaden As Boolean) As ObjektSpielfeld
        Using Reader As New IO.StreamReader(Datei, Hauptmenue.Codierung)
            Dim Kartenname As String = ""

            Dim Z As String = Reader.ReadLine
            If Z.ToLower.StartsWith("kartenname=") Then
                Kartenname = ReplcaceGermanLetters(Z.Split("=")(1))
                Dim Spieler As ObjektSpieler() = {New ObjektSpieler(0, Hauptmenue.SpielerNeutral, 1000, New ObjektKO() {ObjektLadeklasse.NewKO("OFFIZIEROS", 0), Nothing}, 0, Armeen.OS.ToString, "q", Nothing, ObjektSpieler.KIStufen.Einfach, 30000)}
                Dim Breite As Integer
                Dim Hoehe As Integer
                While Reader.EndOfStream = False
                    Z = Reader.ReadLine
                    Z = ReplcaceGermanLetters(Z)
                    If Z.StartsWith("Spieler|") Then
                        Dim Z2 As String() = Z.Split("|")
                        Array.Resize(Spieler, Spieler.Length + 1)
                        Spieler(Spieler.Length - 1) = New ObjektSpieler(Spieler.Length, GetFarbtabelle(Spieler.Length - 2), Z2(1), New ObjektKO() {ObjektLadeklasse.NewKO("OFFIZIEROS", 0), Nothing}, Z2(2), GetArmy(Spieler.Length - 2), GetTeam(Spieler.Length - 2).ToString, Nothing, Z2(3), Z2(4))
                        Continue While
                    End If
                    If Z.ToLower.StartsWith("groesse|") Then
                        Dim Z2 As String() = Z.Split("|")
                        Breite = Z2(1)
                        Hoehe = Z2(2)
                        Exit While
                    End If
                End While
                Dim S As ObjektSpielfeld = New ObjektSpielfeld(Breite, Hoehe, Spieler, New ObjektRegeln(Spieler.Length - 1, False))
                S.Kartenname = Kartenname
                S.Autor = DataSettings.Autor
                While Reader.EndOfStream = False
                    Z = Reader.ReadLine
                    Z = ReplcaceGermanLetters(Z)
                    If Z.ToLower.StartsWith("gebaeude") Then
                        Dim Z2() As String = Z.Split("|")
                        If Not Z2(4) = "VERWEIS" Then
                            S.Landschaften(Z2(1), Z2(2), Z2(3)).Gebaeude = ObjektLadeklasse.NewGebaeude(Z2(4).ToUpper, Z2(5), Z2(8), Z2(6), Z2(1), Z2(2), Z2(7), Z2(3), S)
                        End If
                        Continue While
                    End If
                    'es ist ein Gebaeude
                    If Z.ToLower.StartsWith("landschaft") Then
                        Dim Z2() As String = Z.Split("|")
                        S.Landschaften(Z2(1), Z2(2), Z2(3)) = New ObjektLandschaft(Z2(4).ToUpper, Z2(1), Z2(2), S)
                        Continue While
                    End If
                    'Es ist eine Einheit 
                    If Z.ToLower.StartsWith("einheit") Then
                        Dim Z2() As String = Z.Split("|")
                        S.Einheiten(Z2(1), Z2(2), Z2(3)) = ObjektLadeklasse.NewEinheit(Z2(4).ToUpper, Z2(7) * 10, Z2(6), Z2(5), Z2(8), False, Z2(1), Z2(2), False, False)
                        Continue While
                    End If
                    If Z.ToLower.StartsWith("teinheit") Then
                        Dim Z2() As String = Z.Split("|")
                        Dim E As ObjektEinheit = S.Einheiten(Z2(1), Z2(2), Z2(3))
                        If E IsNot Nothing Then
                            For I = 0 To E.Ladung.Length - 1
                                If E.Ladung(I) Is Nothing Then
                                    S.Einheiten(Z2(1), Z2(2), Z2(3)).Ladung(I) = ObjektLadeklasse.NewEinheit(Z2(4).ToUpper, Z2(7) * 10, Z2(6), Z2(5), Z2(8), False, Z2(1), Z2(2), False, False)
                                    Exit For
                                End If
                            Next
                        End If
                        Continue While
                    End If
                End While
                Return S
            Else
                Return Nothing
            End If
        End Using

    End Function
    Public Shared Function GetFarbtabelle(ByVal Spieler As Integer) As Color
        While Spieler > AlleFarbtabellen.Length
            Spieler -= AlleFarbtabellen.Length
        End While
        Return AlleFarbtabellen(Spieler)
    End Function
    Public Shared Function GetTeam(ByVal Spieler As Integer) As Objektverwalter.ABC
        Dim Teams As Integer = [Enum].GetNames(Objektverwalter.ABC.A.GetType).Length
        While Spieler > Teams
            Spieler -= Teams
        End While
        Return Spieler
    End Function
    Public Shared Function GetArmy(ByVal Spieler As Integer) As String
        Dim Teams As Integer = [Enum].GetNames(Armeen.AC.GetType).Length
        While Spieler > Teams
            Spieler -= Teams
        End While
        Dim A As Armeen = Spieler
        Return A.ToString
    End Function
    ''' <summary>
    ''' Generiert die Bild IDs der Einheiten
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub GenerateUnitIDs()
        If Not Objektverwalter.Spielfeld Is Nothing Then
            Dim Schlacht As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlacht = 1
            For I = 0 To Schlacht
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                        If Not Objektverwalter.Spielfeld.Einheiten(X, Y, I) Is Nothing Then
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I).BildIDbestimmen()
                        End If
                    Next
                Next
            Next
        End If
    End Sub
    Public Shared Sub ImportAllTxtMaps(ByVal ReadPfad As String, ByVal CopyPfad As String, ByVal Suche As Microsoft.VisualBasic.FileIO.SearchOption)
        If Not CopyPfad.EndsWith("\") Then CopyPfad += "\"
        If Not My.Computer.FileSystem.DirectoryExists(CopyPfad) Then
            My.Computer.FileSystem.CreateDirectory(CopyPfad)
        End If
        For Each File In My.Computer.FileSystem.GetFiles(ReadPfad, Suche, "*.txt")
            Dim D As String = File.Replace(ReadPfad, CopyPfad)
            Dim S As ObjektSpielfeld = LoadMapOutOfTxt(File, False, False, False)
            If S IsNot Nothing Then
                Speichern(D.Replace(".txt", ".map"), , S, True)
            End If
        Next
    End Sub
    Public Shared Sub ExportAllTxtMaps(ByVal CopyPfad As String, ByVal ReadPfad As String, ByVal Suche As Microsoft.VisualBasic.FileIO.SearchOption)
        If Not CopyPfad.EndsWith("\") Then CopyPfad += "\"
        If Not My.Computer.FileSystem.DirectoryExists(CopyPfad) Then
            My.Computer.FileSystem.CreateDirectory(CopyPfad)
        End If
        For Each File In My.Computer.FileSystem.GetFiles(ReadPfad, Suche, New String() {"*.map"})
            Using Stream As New IO.FileStream(File, IO.FileMode.Open, IO.FileAccess.Read)
                Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                Dim S As ObjektSpielfeld = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                Dim Name As String = S.Kartenname
                If Name.EndsWith(".map") Or Name.EndsWith(".sav") Or Name.EndsWith(".txt") Then
                    Name = Name.Remove(Name.Length - 4)
                End If
                If Name.Contains("\") Then
                    Name = Name.Remove(0, Name.LastIndexOf("\") + 1)
                End If
                File = File.Replace(ReadPfad, CopyPfad)
                SaveAsTxt(File.Replace(".map", ".txt"), S)
            End Using
        Next
    End Sub
#End Region
#End Region
#Region "Spracherkennung"
    ' Shared EngineSprach As SpeechRecognitionEngine
    ''' <summary>
    ''' Wenn False, dann werden erkannte Woerter nicht mehr beruecksichtigt
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared SprachLauschen As Boolean = True
    ''' <summary>
    ''' Gibt es die Assembly?
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared NoAssemblyFound As Boolean = False
    ''' <summary>
    ''' Initialisiert die Engine fuer die Spracherkennung. Sollte einmal am Anfang des Spieles aufgerufen werden.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub SprachIni()

        If Not NoAssemblyFound Then
            'EngineSprach = New SpeechRecognitionEngine
            'EngineSprach.SetInputToDefaultAudioDevice()

            'Try

            '    SprachReload(Formmodi.Hauptmenue)

            '    AddHandler EngineSprach.SpeechRecognized, AddressOf Spracherkenntnis 'Damit das Event an der richtigen Stelle landet.

            '    EngineSprach.RecognizeAsync(System.Speech.Recognition.RecognizeMode.Multiple) 'Anfangen zu lauschen :)
            '    SprachLauschen = True
            'Catch
            '    SprachLauschen = False
            '    Konsole.Write("SpeechRecognitionEngine: An Error appeared during laoding Grammar!")
            'End Try
        Else
            Konsole.Write("SpeechRecognitionEngine: Assembly not found. Continue without it.")
        End If


    End Sub
    Public Shared Sub SprachReload(ByVal menue As Formmodi)
        If Not NoAssemblyFound Then
            If DataSettings.SprachZuhoeren Then
                Try
                    'EngineSprach.RecognizeAsyncCancel()
                    'EngineSprach.UnloadAllGrammars()
                    'Dim Gramm As New Grammar(DataSettings.Resourcenpfad + "Grammatik\" + menue.ToString + ".gramm", "Thema")
                    'EngineSprach.LoadGrammar(Gramm)
                    'EngineSprach.SetInputToDefaultAudioDevice()
                    'EngineSprach.RecognizeAsync(System.Speech.Recognition.RecognizeMode.Multiple) 'Anfangen zu lauschen :)
                    SprachLauschen = True
                Catch
                    SprachLauschen = False
                    Konsole.Write("SpeechRecognitionEngine: An Error appeared during laoding Grammar!")
                End Try
            End If
        End If
    End Sub
    '''' <summary>
    '''' Diese Routine wird eigentlich nur von dem Event der Spracherkennung aufgerufen. Nicht zum aufrufen gedacht.
    '''' </summary>
    '''' <param name="sender"></param>
    '''' <param name="e"></param>
    '''' <remarks></remarks>
    'Private Shared Sub Spracherkenntnis(ByVal sender As Object, ByVal e As System.Speech.Recognition.SpeechRecognizedEventArgs)
    '    If Not NoAssemblyFound Then
    '        If SprachLauschen And DataSettings.SprachZuhoeren Then 'Nur wenn wir grad zuhoeren sollen
    '            If e.Result.Confidence >= DataSettings.SprachSensitivitaet Then
    '                If Objektverwalter.Menue IsNot Nothing Then
    '                    Objektverwalter.Menue.SprachEingabe(e.Result.Text)
    '                End If
    '            End If
    '        End If
    '    End If
    'End Sub
#End Region
#Region "Netzwerk"
    ''' <summary>
    ''' Our Connection
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Connection As New GameConnection
    Public Shared NetzVorratsBefehleLocker As New Mutex
    ''' <summary>
    ''' Orders for Network
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared NetzVorratsBefehle As New List(Of KINetzwerkBefehl)
    ''' <summary>
    ''' The Lobby for Multiplayer Games.
    ''' When Host opens immediatly with Gamestart.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Lobby As BaseLobby
    'Andere Routinen:
    Public Shared Sub NetzBefehlSenden(ByVal _Befehl As KINetzwerkBefehl, ByVal Nomove As Boolean)
        Dim s As String = "Befehl0|" + CInt(_Befehl.Befehl).ToString + "|"
        s += _Befehl.KooX.ToString + "|"
        s += _Befehl.KooY.ToString + "|"
        Dim WX As String = ""
        Dim WY As String = ""
        If _Befehl.WegX IsNot Nothing Then
            For I = 0 To _Befehl.WegX.Length - 1
                If I = _Befehl.WegX.Length - 1 Then
                    WX += _Befehl.WegX(I).ToString + "|"
                    WY += _Befehl.WegY(I).ToString + "|"
                Else
                    WX += _Befehl.WegX(I).ToString + "$"
                    WY += _Befehl.WegY(I).ToString + "$"
                End If
            Next
        End If
        s += WX
        s += WY
        s += _Befehl.OpferX.ToString + "|"
        s += _Befehl.OpferY.ToString + "|"
        s += _Befehl.AngreiferSchaden.ToString + "|"
        s += _Befehl.Verteidigerschaden.ToString + "|"
        s += _Befehl.Spieler.ToString
        If Connection.Connected Then
            Connection.SendData(New NetworkPaket(s))
        End If
        If DataSettings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile(s)
        End If
    End Sub
    Public Shared Sub NetzBefehlSenden(ByVal _Befehl As KINetzwerkBefehl)
        Dim s As String = "Befehl1|" + CInt(_Befehl.Befehl).ToString + "|"
        s += _Befehl.KooX.ToString + "|"
        s += _Befehl.KooY.ToString + "|"
        Dim WX As String = ""
        Dim WY As String = ""
        For I = 0 To _Befehl.WegX.Length - 1
            If I = _Befehl.WegX.Length - 1 Then
                WX += _Befehl.WegX(I).ToString + "|"
                WY += _Befehl.WegY(I).ToString + "|"
            Else
                WX += _Befehl.WegX(I).ToString + "$"
                WY += _Befehl.WegY(I).ToString + "$"
            End If
        Next
        s += WX
        s += WY
        s += _Befehl.OpferX.ToString + "|"
        s += _Befehl.OpferY.ToString + "|"
        s += _Befehl.AngreiferSchaden.ToString + "|"
        s += _Befehl.Verteidigerschaden.ToString + "|"
        s += _Befehl.Spieler.ToString
        If Hauptmenue.Connection IsNot Nothing Then
            If Connection.Connected Then
                Connection.SendData(New NetworkPaket(s))
            End If
        End If
        If DataSettings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile(s)
        End If
    End Sub
    Public Shared Sub NetzBefehlSenden(ByVal V As Net_Orders)
        If Not Connection.Connected Then Exit Sub 'Das muss in keine Aufzeichnung rein :)
        Select Case V
            Case Net_Orders.Player_Ready
                If Not Connection.Hosten Then
                    Connection.SendData(New NetworkPaket(V.ToString))
                Else
                    Connection.IsReady(V)
                End If
            Case Else
                Connection.SendData(New NetworkPaket(V.ToString))
        End Select
    End Sub
    Public Shared Sub NetzBefehlSenden(ByVal Wetteraenderung As ObjektSpielfeld.Wetterarten)
        Dim i As Integer = Wetteraenderung
        If Connection.Connected Then
            If Objektverwalter.Spielfeld IsNot Nothing Then
                Connection.SendData(New NetworkPaket("Befehl0|Wetter|" + i.ToString + "|" + Objektverwalter.Spielfeld.AktuellerSpieler.Spieler.ToString))
            End If
        End If
        If DataSettings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile("Befehl0|Wetter|" + i.ToString + "|" + Objektverwalter.Spielfeld.AktuellerSpieler.Spieler.ToString)
        End If
    End Sub
    Public Shared Sub NetzBefehlSenden(ByVal Data As String)
        If Connection.Connected Then
            Connection.SendData(New NetworkPaket(Data))
        End If
    End Sub
    Public Shared Sub NetzBefehlSendenWolkenBewegen(ByVal X As Integer, ByVal Y As Integer, ByVal neuX As Integer, ByVal neuY As Integer)
        'Dim Paket As New NetworkPacket()
        'Paket.Write("Befehl0|Wolkenbewegen|" + X.ToString + "|" + Y.ToString + "|" + neuX.ToString + "|" + neuY.ToString)
        If Connection.Connected Then
            Connection.SendData(New NetworkPaket("Befehl0|Wolkenbewegen|" + X.ToString + "|" + Y.ToString + "|" + neuX.ToString + "|" + neuY.ToString))
        End If
        If DataSettings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile("Befehl0|Wolkenbewegen|" + X.ToString + "|" + Y.ToString + "|" + neuX.ToString + "|" + neuY.ToString)
        End If
    End Sub
    Public Shared Sub NetzBefehlVulkanFeuer(ByVal X As Integer, ByVal Y As Integer, ByVal GetroffeneZiele() As Point)
        Dim Daten As String = "Befehl0|Vulkan|" + X.ToString + "|" + Y.ToString + "|"
        For I = 0 To GetroffeneZiele.Length - 1
            If I = GetroffeneZiele.Length - 1 Then
                Daten += GetroffeneZiele(I).ToString
            Else
                Daten += GetroffeneZiele(I).ToString + "|"
            End If
        Next

        If Connection.Connected Then
            Connection.SendData(New NetworkPaket(Daten))
        End If
        If DataSettings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile(Daten)
        End If
    End Sub
    Public Shared Sub NetzBefehlSendenLadeBildschirmFortschritt(ByVal Player As Integer, ByVal Percentage As Integer)
        If Connection.Connected Then
            Connection.SendData(New NetworkPaket("Ladebildschirm|Percentage|" + Player.ToString + "|" + Percentage.ToString))
        End If
    End Sub



    Public Shared Sub NetzBefehlSenden(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Treibstoff As Integer)
        Dim s As String = "Befehl0|Treibstoff|" + X.ToString + "|" + Y.ToString + "|" + Schlacht.ToString + "|" + Treibstoff.ToString
        If Connection.Connected Then
            Connection.SendData(New NetworkPaket(s))
        End If
        If DataSettings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile(s)
        End If
    End Sub
    Public Shared Sub NetzBefehlSendenName(ByVal Nickname As String, ByVal Player As Integer)
        If Not Connection.Connected Then Exit Sub
        Connection.SendData(New NetworkPaket("Vorbereitung|Name|" + Player.ToString + "|" + Nickname + "|" + Connection.Hosten.ToString))
    End Sub
    Public Shared Sub NetzBefehlSendenEinheitVerbessern(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal ATKBoost As Integer, ByVal BewBoost As Integer)
        If Connection.Connected Then
            Connection.SendData(New NetworkPaket("Befehl0|Verbessern|" + ATKBoost.ToString + "|" + BewBoost.ToString))
        End If
        If DataSettings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile("Befehl0|Verbessern|" + ATKBoost.ToString + "|" + BewBoost.ToString)
        End If
    End Sub
    Public Shared Sub NetzBefehlSendenSchlachtfeldWechsel(ByVal Spieler As Integer)
        If Connection.Connected Then
            Connection.SendData(New NetworkPaket("Befehl0|SchlachtWechsel|" + Spieler.ToString))
        End If
        If DataSettings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile("Befehl0|SchlachtWechsel|" + Spieler.ToString)
        End If
    End Sub
    ''' <summary>
    ''' Laesst alle Netzwerkteilnehmer den Gleichen KO fuer einen Spieler auswaehlen.
    ''' </summary>
    ''' <param name="Spieler">Der Spieler, dessen KO betroffen ist.</param>
    ''' <param name="KOID">Die ID des zu setzenden KOs</param>
    ''' <param name="Stelle">Ob an Erster oder Zweiter stelle das heisst[ 0 oder 1 ] !!!</param>
    ''' <remarks></remarks>
    Public Shared Sub NetzBefehlKartenauswahlSendenKO(ByVal Spieler As Integer, ByVal KOID As String, ByVal Stelle As Integer)
        If Hauptmenue.Connection Is Nothing Then Exit Sub
        If Not Connection.Connected Then Exit Sub
        Connection.SendData(New NetworkPaket("Vorbereitung|KO|" + Spieler.ToString + "|" + KOID + "|" + Stelle.ToString + "|" + Connection.Hosten.ToString))
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenRegeln(ByVal Regeln As ObjektRegeln)
        Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
        If Not Connection.Connected Then Exit Sub
        Connection.SendData(New NetworkPaket(Regeln.ToString))
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <param name="KI">Die KI, also entweder Einfach und so, oder Passiv, wenn man Mensch ist. Es ist also das was an die anderen gesendet wird, und nicht was fuer diesen Computer zaehlt.</param>
    ''' <remarks></remarks>
    Public Shared Sub NetzBefehlKartenauswahlSendenKI(ByVal Spieler As Integer, ByVal KI As String, ByVal Name As String)
        If Not Connection.Connected Then Exit Sub
        Connection.SendData(New NetworkPaket("Vorbereitung|KI|" + Spieler.ToString + "|" + KI + "|" + Name + "|" + Connection.Hosten.ToString))
    End Sub

    Public Shared Sub NetzChatSenden(ByVal text As String)
        If Connection.Connected Then 'Nur zur sicherheit, bevor irgendein Idiot auf die Idee kommt in einem nicht-Netzwerkspiel uebers Netzwerk zu chatten
            Dim Spieler As ObjektSpieler = Objektverwalter.Spielfeld.AktuellerSpieler 'Falls irgendetwas ganz gewaltig schief laeuft, (naja eigentlich einfach nur: Es gibt keinen Menschlichen Spieler mehr), dann sagt lieber der Aktive Spieler was, als das das Spiel abstuerzt ;)
            For Each Sp In Objektverwalter.Spielfeld.Spieler
                If Sp.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    If Sp.Spieler = 0 Then Continue For
                    'Jetzt haben wir zumindest einen Menschen gefunden. Gehen wir mal davon aus, dass er derjenige ist, welcher Chatten will :)
                    Spieler = Sp
                    Exit For
                End If
            Next

            Dim s As String = "Chat|" + Spieler.Spieler.ToString + "|" + Spieler.KOS(0).KOID + "|" + text
            Connection.SendData(New NetworkPaket(s))
        End If
    End Sub
    Public Shared Sub NetzDatenKartentransfer(ByVal PlayerID As Integer, Optional ByVal All As Boolean = False)
        If Connection.Connected Then 'Ansonsten ist das Kartensenden eh Sinnlos :)
            If TypeOf Objektverwalter.Menue Is ObjektKartenauswahlMenue Then
                Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
                Dim PfadKomplett As String = M.Kartenname(ObjektKartenauswahlMenue.AngezeigteKarten(ObjektKartenauswahlMenue.MomentaneKarte))
                '    Console.WriteLine("Folgende Karte wird ueber das Netzwerk an alle Clienten gesendet: " + PfadKomplett.Remove(0, PfadKomplett.LastIndexOf("\") + 1).Replace(".map", ""))
                If My.Computer.FileSystem.FileExists(PfadKomplett) Then 'Ich vermute mal, dass das ueberfluessig ist, aber man weiss ja nie...
                    Dim Bytes As Byte() = My.Computer.FileSystem.ReadAllBytes(PfadKomplett)
                    Dim Paket As New NetworkPaket
                    Paket.Write("Karte:")
                    Paket.Write(Bytes)
                    'SendFlags.Guaranteed SendFlags.NoLoopback SendFlags.Coalesce
                    If All Then
                        Connection.SendData(Paket)
                    Else
                        Connection.SendData(Paket, PlayerID)
                    End If

                    'NetzConnection.SendTo(0, Paket, 0, SendFlags.Guaranteed) 'For Tests
                End If

            End If
        End If
    End Sub
    ''' <summary>
    ''' This function sends all Custom files to the Players
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub NetzCustomDatentransfer(ByVal PlayerID As Integer)
        If Connection.Connected Then 'Ansonsten ist das Kartensenden eh Sinnlos :)
            Connection.SendData(New NetworkPaket("custom stuff:start"), PlayerID)
            For Each Directory In My.Computer.FileSystem.GetDirectories(DataSettings.Resourcenpfad + "!Custom\Multiplayer\", FileIO.SearchOption.SearchAllSubDirectories)
                For Each File In My.Computer.FileSystem.GetFiles(Directory, FileIO.SearchOption.SearchTopLevelOnly)
                    Dim Data As String = ""
                    If Directory.EndsWith("Unit\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".ent", "")
                        Data = "custom stuff unit:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung)
                    ElseIf Directory.EndsWith("Sprites\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".png", "")
                        Data = "custom stuff unit image:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung)
                    ElseIf Directory.EndsWith("(Optional) Zoomed Out\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".png", "")
                        Data = "custom stuff unit image zoomed:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung)
                    ElseIf Directory.EndsWith("co\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".cco", "")
                        Data = "custom stuff co:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung)
                    ElseIf Directory.EndsWith("co desc\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".desc", "")
                        Data = "custom stuff co desc:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung)
                    ElseIf Directory.EndsWith("co sprite\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".png", "")
                        Data = "custom stuff co sprite:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung)
                    End If
                    If Data.Length > 0 Then
                        Connection.SendData(New NetworkPaket(Data), PlayerID)
                    End If
                Next
            Next
            Connection.SendData(New NetworkPaket("custom stuff:end"), PlayerID)
        End If
    End Sub
    Public Shared Sub NetzBefehlRecieved(ByVal line As String, Optional ByVal PlayerID As Integer = 0)
        If NetzProtokoll Then
            Konsole.Write(line)
        End If
        If line.ToLower.StartsWith("custom stuff") Then
            NetzBefehlCustomStuffRecieved(line)
            Exit Sub
        End If
        If line.ToLower.StartsWith("game:") Then
            If Not Hauptmenue.Connection.Hosten Then
                If Hauptmenue.Lobby IsNot Nothing Then
                    If Hauptmenue.Lobby.CurrentGame Is Nothing Then
                        Hauptmenue.Lobby.CurrentGame = New GameInfo(line.Split(":"))
                    End If
                End If
            End If
            Exit Sub
        End If
        Dim sInfo() As String = line.Split("|") 'auseinander nehmen und dann bearbeiten
        Select Case sInfo(0).ToLower
            Case "ScriptEvent".ToLower
                'Check for Connection
                If Hauptmenue.Connection.Connected Then
                    NetzBefehlEmpfangen(New KINetzwerkBefehl(sInfo))
                Else
                    KIPassivNetzwerk.sInfoOrder(sInfo)
                End If
            Case "Befehl1".ToLower
                NetzBefehlEmpfangen(New KINetzwerkBefehl(CInt(sInfo(1)), CInt(sInfo(2)), CInt(sInfo(3)), ToIntArry(sInfo(4).Split("$")), ToIntArry(sInfo(5).Split("$")), CInt(sInfo(6)), CInt(sInfo(7)), CSng(sInfo(8)), CSng(sInfo(9)), CInt(sInfo(10))))
            Case "Befehl0".ToLower
                Select Case sInfo(1).ToLower
                    Case "Wetter".ToLower
                        'Eine Wetteraenderung, wie interressant :)
                        If sInfo.Length > 3 Then
                            NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.WetterWechsel, CInt(sInfo(2)), 0, Nothing, Nothing, -1, -1, 0, 0, CInt(sInfo(3))))
                        Else
                            NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.WetterWechsel, CInt(sInfo(2)), 0, Nothing, Nothing, -1, -1, 0, 0, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler))
                        End If
                    Case "SchlachtWechsel".ToLower
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.Schlachtwechseln, 0, 0, New Integer() {0}, New Integer() {0}, 0, 0, 0, 0, sInfo(2)))
                    Case "Wolkenbewegen".ToLower
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.WolkeBewegen, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), 0, 0, 0))
                    Case "vulkan"
                        'Der Vulkan auf dieser Karte speit Feuer wie unguenstig
                        Dim Ziele(sInfo.Length - 5) As Point
                        For I = 4 To sInfo.Length - 1
                            Ziele(I - 4) = CPoint(sInfo(I))
                        Next
                        Dim WegX(Ziele.Length - 1) As Integer
                        Dim WegY(Ziele.Length - 1) As Integer
                        For I = 0 To Ziele.Length - 1
                            WegX(I) = Ziele(I).X
                            WegY(I) = Ziele(I).Y
                        Next
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.VulkanFeuer, sInfo(2), sInfo(3), WegX, WegY, 0, 0, 0, 0, 0))
                    Case "verbessern"
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.EinheitVerbessern, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), sInfo(6), 0, 0))
                    Case "treibstoff"
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.EinheitTreibstoffSetzen, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), 0, 0, 0))
                    Case "shockunit"
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.ShockUnit, sInfo(2), sInfo(3), Nothing, Nothing, -1, -1, -1, -1, -1))
                    Case "placebuilding"
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.PlaceBuilding, sInfo(2), sInfo(3), Nothing, Nothing, -1, -1, sInfo(6), -1, CInt(sInfo(10))))
                    Case "launchrocket"
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.LaunchRocket, CInt(sInfo(2)), CInt(sInfo(3)), Nothing, Nothing, CInt(sInfo(6)), CInt(sInfo(7)), CSng(sInfo(8)), CSng(sInfo(9)), CInt(sInfo(10))))
                    Case "invasionunit"
                        NetzBefehlEmpfangen(New KINetzwerkBefehl(ObjektKI.KIModiExtern.InvasionUnit, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), -1, -1, -1, CInt(sInfo(10))))
                End Select
            Case "update"
                Select Case sInfo(1).ToLower
                    Case "timer"
                        Objektverwalter.Spielfeld.Game_Timer(CInt(sInfo(3))).Settime(CLng(sInfo(2)))
                End Select
            Case "ladebildschirm"
                Select Case sInfo(1).ToLower
                    Case "percentage"
                        If ObjektLadebildschirm.Percentage IsNot Nothing Then
                            If ObjektLadebildschirm.Percentage.Count > CInt(sInfo(2)) Then
                                ObjektLadebildschirm.PercentageLocker.Lock()
                                ObjektLadebildschirm.Percentage(CInt(sInfo(2)) - 1) = sInfo(3)
                                ObjektLadebildschirm.PercentageLocker.Unlock()
                            End If
                        End If
                End Select

            Case "Vorbereitung".ToLower
                If TypeOf Objektverwalter.Menue Is ObjektNetzwerkMenue Then
                    Dim M As ObjektNetzwerkMenue = Objektverwalter.Menue
                    Try
                        Select Case sInfo(1).ToLower
                            Case "client"
                                For i = 0 To ((sInfo.Length - 2) / 6) - 1
                                    Dim Player As Integer = CInt(sInfo(i * 6 + 2))
                                    Dim Team As Char = sInfo(i * 6 + 4)
                                    Dim Autor As String = sInfo(i * 6 + 3)
                                    Dim KO1 As String = sInfo(i * 6 + 5)
                                    Dim KO2 As String = sInfo(i * 6 + 6)
                                    Dim farbe As Color = Color.FromArgb(sInfo(i * 6 + 7))
                                    'Store the Data in the Menue
                                    M.ClientDataMutex.Lock()
                                    M.ClientDatas.Add(New ObjektNetzwerkMenue.ClientPlayerData(Player, Team, Autor, KO1, KO2, farbe, PlayerID))
                                    M.ClientDataMutex.Unlock()
                                Next
                            Case "host"
                                'Host Data change all Data to the Host data
                                For i = 0 To ((sInfo.Length - 2) / 11) - 1
                                    Dim Player As Integer = CInt(sInfo(i * 11 + 2))
                                    Dim Autor As String = sInfo(i * 11 + 3)
                                    Dim Team As Char = sInfo(i * 11 + 4)
                                    Dim KO1 As String = sInfo(i * 11 + 5)
                                    Dim KO2 As String = sInfo(i * 11 + 6)
                                    Dim farbe As Color = Color.FromArgb(sInfo(i * 11 + 7))
                                    Dim KI As ObjektSpieler.KIStufen = CInt(sInfo(i * 11 + 8))
                                    Dim Startfonds As Integer = CInt(sInfo(i * 11 + 9))
                                    Dim FondsproStadt As Integer = CInt(sInfo(i * 11 + 10))
                                    Dim FondsproFabrik As Integer = CInt(sInfo(i * 11 + 11))
                                    Dim B As New Bauliste(sInfo(i * 11 + 12).Split("_"))
                                    ObjektKartenauswahlMenue.SetPlayerName(Player, Autor)
                                    M.Teams(Player) = Team
                                    If M.Spielerdaten.Length >= Player Then
                                        M.Spielerdaten(Player - 1).SetTeam(M.Teams(Player))
                                    End If
                                    If KO1.ToUpper = "Nothing".ToUpper Then
                                        M.KOS(Player, 0) = Nothing 'Eigentlich wollen wir mehr einen KO wegmachen, als einen neuen erschaffen.
                                    Else
                                        M.KOS(Player, 0) = ObjektLadeklasse.NewKO(KO1, Player)
                                    End If
                                    If KO2.ToUpper = "Nothing".ToUpper Then
                                        M.KOS(Player, 1) = Nothing 'Eigentlich wollen wir mehr einen KO wegmachen, als einen neuen erschaffen.
                                    Else
                                        M.KOS(Player, 1) = ObjektLadeklasse.NewKO(KO2, Player)
                                    End If
                                    M.Farbtabellen(Player) = farbe
                                    M.Spielerdaten(Player - 1).SetSpielerFarbe(farbe.ToArgb.ToString)
                                    M.SetKIStufe(Player, KI)
                                    M.Startfonds(Player) = Startfonds
                                    M.Spielerdaten(Player - 1).SetStartFonds(Startfonds)
                                    M.FondsproFabrik(Player) = FondsproStadt
                                    M.Spielerdaten(Player - 1).SetFabrikfonds(FondsproStadt)
                                    M.FondsproStadt(Player) = FondsproFabrik
                                    M.Spielerdaten(Player - 1).SetFondsProStadt(FondsproFabrik)
                                    M.Spielerdaten(i).SetDaten(Startfonds, FondsproStadt, FondsproFabrik, Team, -1)
                                    M.Baulisten(Player) = B
                                    M.Spielerdaten(Player - 1).ChangeBauliste(-1, M)
                                Next
                                M.ErstesUpdateEmpfangen = True
                            Case "KO".ToLower
                                If sInfo(3).ToUpper = "Nothing".ToUpper Then
                                    M.KOS(sInfo(2), sInfo(4)) = Nothing 'Eigentlich wollen wir mehr einen KO wegmachen, als einen neuen erschaffen.
                                Else
                                    M.KOS(sInfo(2), sInfo(4)) = ObjektLadeklasse.NewKO(sInfo(3), sInfo(2))
                                End If
                            Case "KI".ToLower
                                Dim Stufe As ObjektSpieler.KIStufen
                                If IsNumeric(sInfo(3)) Then
                                    Stufe = CInt(sInfo(3))
                                Else
                                    Stufe = [Enum].Parse(ObjektSpieler.KIStufen.Einfach.GetType, sInfo(3))
                                End If
                                If Stufe = ObjektSpieler.KIStufen.Mensch Then
                                    M.SetKIStufe(sInfo(2), ObjektSpieler.KIStufen.Passiv)
                                Else
                                    M.SetKIStufe(sInfo(2), Stufe)
                                End If
                                ObjektKartenauswahlMenue.SetPlayerName(sInfo(2), sInfo(4))
                            Case "regeln" 'Hier laden wir die Regeln...
                                If Not M.RuleRecieved Then
                                    M.Regeln = New ObjektRegeln(sInfo)
                                    M.RuleRecieved = True
                                End If
                        End Select
                    Catch
                        Konsole.Write("Asynchron Datatransfer Error. Resending Data...")
                    End Try
                End If
            Case "Chat".ToLower
                If Objektverwalter.Spielfeld IsNot Nothing And TypeOf Objektverwalter.Menue Is ObjektSpielMenue Then
                    Dim Teams As String() = sInfo(1).Split("_")
                    If Teams.Length > 0 Then
                        If Teams(0) = "" And Teams.Length = 1 Then
                            Chatroom.getMessage(New Chat.Message(sInfo(3), sInfo(2), sInfo(4)))
                        Else
                            For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                                If Teams.Contains(Objektverwalter.Spielfeld.Spieler(I).Team) Then
                                    Chatroom.getMessage(New Chat.Message(sInfo(3), sInfo(2), sInfo(4)))
                                End If
                            Next
                        End If
                    Else
                        Chatroom.getMessage(New Chat.Message(sInfo(3), sInfo(2), sInfo(4)))
                    End If
                Else
                    Chatroom.getMessage(New Chat.Message(sInfo(3), sInfo(2), -1))
                End If
            Case Net_Orders.Game_Loaded.ToString.ToLower
                ObjektLadebildschirm.ReadyLocker.Lock()
                ObjektLadebildschirm.Ready(CInt(sInfo(1)) - 1) = True
                ObjektLadebildschirm.ReadyLocker.Unlock()
        End Select
    End Sub
    Public Shared Sub NetzBefehlRecieved(ByVal Paket As NetworkPaket, ByVal PlayerID As Integer)
        If NetzProtokoll Then
            Konsole.Write("Received a Map from another Player.")
        End If
        'Das Paket empfangen
        Dim Nachricht As String = Paket.ReadString
        Nachricht = Nachricht.Remove(0, Nachricht.IndexOf("|") + 1)
        If Nachricht.StartsWith("Karte:") Then
            'Die Frage ist nur: Wo speichern?
            Dim Pfad As String = ""
            Dim i As Integer = 1
            Dim gefunden As Boolean = False
            Dim M As ObjektNetzwerkMenue = Objektverwalter.Menue
            'Hier wird versucht zu schauen, ob es diese Karte bereits gibt.
            Do While Not gefunden
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Maps\NetzKarte" + i.ToString + ".map") Then
                    i += 1
                Else
                    Pfad = DataSettings.Resourcenpfad + "Maps\NetzKarte" + i.ToString + ".map"
                    gefunden = True
                End If
            Loop
            Dim B As New Byte
            Paket.Position = Hauptmenue.Codierung.GetBytes(Paket.ReadString.Split("|")(0) + "|Karte:").Length
            Using StrW As New IO.FileStream(Pfad, IO.FileMode.CreateNew, IO.FileAccess.Write)
                While Paket.Position < Paket.Length
                    StrW.WriteByte(Paket.Read())
                End While
            End Using
            Dim S As ObjektSpielfeld = KarteDefaultLaden(Pfad)
            If Not M.KarteFestlegenHashcode(S, Pfad) Then
                M.AddKarte(Pfad)
                If Not M.IsSpielInizialiesiert Then
                    M.KarteFestlegenAn(M.Kartenname.Length - 1)
                End If
                Exit Sub
            Else
                My.Computer.FileSystem.DeleteFile(Pfad) 'Well we don't need it.
                Exit Sub
            End If
        End If
        NetzBefehlRecieved(Nachricht, PlayerID)
    End Sub
    Public Shared Sub NetzBefehlEmpfangen(ByVal Befehl As KINetzwerkBefehl)
        While Not TypeOf Objektverwalter.Menue Is ObjektSpielMenue
            Konsole.Write("Recieved Orders, but no Game started wait for Game start.")
            Threading.Thread.Sleep(100)
        End While
        Dim Spielmenue As ObjektSpielMenue = Objektverwalter.Menue
        If TypeOf Objektverwalter.Spielfeld.CurrentAI Is KIPassivNetzwerk Then

            If Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                Dim KIPassiv As KIPassivNetzwerk = Objektverwalter.Spielfeld.CurrentAI
                KIPassiv.AddBefehl(Befehl)
            ElseIf Befehl.Spieler = 0 Then
                If Not Objektverwalter.Spielfeld.CurrentAI.Schleife Then
                    Dim KIPassiv As KIPassivNetzwerk = Objektverwalter.Spielfeld.CurrentAI
                    KIPassiv.AddBefehl(Befehl)
                Else
                    NetzVorratsBefehleLocker.Lock()
                    NetzVorratsBefehle.Add(Befehl)
                    NetzVorratsBefehleLocker.Unlock()
                End If
            Else
                NetzVorratsBefehleLocker.Lock()
                NetzVorratsBefehle.Add(Befehl)
                NetzVorratsBefehleLocker.Unlock()
            End If
        Else
            NetzVorratsBefehleLocker.Lock()
            NetzVorratsBefehle.Add(Befehl)
            NetzVorratsBefehleLocker.Unlock()
        End If
    End Sub
    ''' <summary>
    ''' Let's save all Custom Units
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub NetzBefehlCustomStuffRecieved(ByVal Nachricht As String)
        If Nachricht.StartsWith("custom stuff:start") Then
            Dim M As ObjektNetzwerkMenue = Objektverwalter.Menue
            If Not M.CustomStuffReceieved Then
                For Each Directory In My.Computer.FileSystem.GetDirectories(DataSettings.Resourcenpfad + "!Custom\Multiplayer\", FileIO.SearchOption.SearchAllSubDirectories)
                    For Each File In My.Computer.FileSystem.GetFiles(Directory, FileIO.SearchOption.SearchTopLevelOnly)
                        My.Computer.FileSystem.DeleteFile(File)
                    Next
                Next
                If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\") Then
                    My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\Sprites\") Then
                    My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\Sprites\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\Sprites\(Optional) Zoomed Out\") Then
                    My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\Sprites\(Optional) Zoomed Out\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "!Custom\Multiplayer\CO\") Then
                    My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\CO\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "!Custom\Multiplayer\CO\CO Sprite\") Then
                    My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\CO\CO Sprite\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "!Custom\Multiplayer\CO\CO Desc\") Then
                    My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\CO\CO Desc\")
                End If
            End If
            'Unit saving:
        ElseIf Nachricht.StartsWith("custom stuff unit:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\" + N(1) + ".ent", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff unit image:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\Sprites\" + N(1) + ".png", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff unit image zoomed:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText(DataSettings.Resourcenpfad + "!Custom\Multiplayer\Unit\Sprites\(Optional) Zoomed Out\" + N(1) + ".png", N(2), False, Codierung)
            'Custom CO saving:
        ElseIf Nachricht.StartsWith("custom stuff co:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText(DataSettings.Resourcenpfad + "!Custom\Multiplayer\CO\" + N(1) + ".CCO", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff co desc:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText(DataSettings.Resourcenpfad + "!Custom\Multiplayer\CO\CO Desc\" + N(1) + ".desc", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff co sprite:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText(DataSettings.Resourcenpfad + "!Custom\Multiplayer\CO\CO Sprite\" + N(1) + ".png", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff:end") Then
            Dim M As ObjektNetzwerkMenue = Objektverwalter.Menue
            M.CustomStuffReceieved = True
        End If

    End Sub
#End Region
#Region "Aufzeichnung"
    'Die Aufzeichnung laeuft im Prinzip genauso ab, wie ein Netzwerkspiel.. Nur dass in eine Datei geschrieben wird, anstatt uebers Netz gesendet.
    Private Shared AufzeichnungStrW As IO.StreamWriter
    Public Shared AufzeichnungStrR As IO.StreamReader
    ''' <summary>
    ''' Der Boolen, ob das Spiel aufgezeichnet wird. NICHT VERAeNDERN lieber AufzeichnungStart(), oder AufzeichnungEnde() aufrufen!
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared AufzeichnungAktiv As Boolean = False
    ''' <summary>
    ''' Der Boolen, ob eine Aufzeichnung abgespielt wird. NICHT VERAeNDERN lieber AufzeichnungStart(), oder AufzeichnungEnde() aufrufen!
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared AufzeichnungAbspielen As Boolean = False
    Private Shared AufzeichnungAbspielenThread As Threading.Thread = Nothing
    Private Shared Aufzeichnungspfad As String = ""
    Public Shared AufzeichnungLaden As Boolean = False
    ''' <summary>
    ''' Das Spielfeld zu beginn der Aufzeichnung
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared StartSpielfeld As ObjektSpielfeld
    ''' <summary>
    ''' The actual Record Position
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared RecordPosition As Integer = -1
    ''' <summary>
    ''' Die laenge dieser Aufzeichnung
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared MaxRecordPosition As Integer = 0

    Public Shared Aufzeichnungsspulen As Boolean = False
    ''' <summary>
    ''' Die momentane Aufzeichnung pausiert.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared AufzeichnungsPause As Boolean = False
    ''' <summary>
    ''' Laesst eine Aufzeichnung beginnen.
    ''' </summary>
    ''' <param name="NeuAufzeichnung">Wenn = True, wird eine neue Aufzeichnung erstellt, gegebenenfalls ueberschrieben. Bei False, wird eine Aufzeichnung angefangen, oder gegebenenfalls fortgesetzt.</param>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungStart(ByVal NeuAufzeichnung As Boolean)
        Dim Nam As String = "NoName"
        If Objektverwalter.Spielfeld IsNot Nothing Then
            Nam = Objektverwalter.Spielfeld.Kartenname
        End If
        AufzeichnungStart(Nam, NeuAufzeichnung)
    End Sub
    ''' <summary>
    ''' Laesst eine Aufzeichnung beginnen.
    ''' </summary>
    ''' <param name="Aufzeichnungsname">Name ohne Endung</param>
    ''' <param name="NeuAufzeichnung">Wenn = True, wird eine neue Aufzeichnung erstellt, gegebenenfalls ueberschrieben. Bei False, wird eine Aufzeichnung angefangen, oder gegebenenfalls fortgesetzt.</param>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungStart(ByVal Aufzeichnungsname As String, ByVal NeuAufzeichnung As Boolean)

        If AufzeichnungAktiv Then AufzeichnungEnde(Aufzeichnungspfad) 'hoppla, bevor wir anfangen, muessen wir das alte erstmal beenden.
        If Aufzeichnungsname.ToLower.EndsWith(".map") Then
            Aufzeichnungspfad = Aufzeichnungsname.Replace(".map", ".rpl")
        ElseIf Aufzeichnungsname.ToLower.EndsWith(".sav") Then
            Aufzeichnungspfad = Aufzeichnungsname.Replace(".sav", ".rpl")
        ElseIf Aufzeichnungsname.ToLower.EndsWith(".rpl") Then
            Aufzeichnungspfad = Aufzeichnungsname
        Else
            Aufzeichnungspfad = DataSettings.Resourcenpfad + "Record\active\" + Aufzeichnungsname + ".rpl"
        End If
        If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "Record\active\") Then
            My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "Record\active\")
        End If
        If NeuAufzeichnung Then
            AufzeichnungStrW = New IO.StreamWriter(DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", False, Hauptmenue.Codierung)
            AufzeichnungAktiv = True
            AufzeichnungWriteHeader(Aufzeichnungsname)
        Else
            If My.Computer.FileSystem.FileExists(Aufzeichnungspfad) Then
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl") Then
                    My.Computer.FileSystem.DeleteFile(DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl")
                End If
                My.Computer.FileSystem.CopyFile(Aufzeichnungspfad, DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl")
                AufzeichnungStrW = New IO.StreamWriter(DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", True, Hauptmenue.Codierung)
                AufzeichnungAktiv = True
            Else
                AufzeichnungStrW = New IO.StreamWriter(DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", False, Hauptmenue.Codierung)
                AufzeichnungAktiv = True
                AufzeichnungWriteHeader(Aufzeichnungsname)
            End If
        End If

    End Sub
    Public Shared Sub AufzeichnungSichern(ByVal Zielpfad As String)
        My.Computer.FileSystem.CopyFile(DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", Zielpfad, True)
    End Sub
    ''' <summary>
    ''' Bricht eine Aufzeichnung ab. Wenn man also ein Spiel beendet, ohne es gewonnen oder verloren zu haben.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungAbbrechen(ByVal Zielpfad As String)
        If Not AufzeichnungAktiv Then Exit Sub 'Was machen wir dann ueberhaupt hier?
        AufzeichnungStrW.Flush()
        AufzeichnungStrW.Close()
        AufzeichnungAktiv = False
        Aufzeichnungspfad = Zielpfad
        My.Computer.FileSystem.MoveFile(DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", Aufzeichnungspfad)
    End Sub
    ''' <summary>
    ''' Finishes a Replay without saving it.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungAbbrechen()
        If Not AufzeichnungAktiv Then Exit Sub 'Was machen wir dann ueberhaupt hier?
        AufzeichnungStrW.Flush()
        AufzeichnungStrW.Close()
        AufzeichnungAktiv = False
    End Sub
    ''' <summary>
    ''' Beendet eine Aufzeichnung ordnungsgemaess, wird NICHT aufgerufen, wenn ein Spiel beendet wird, ohne dass einer Gewonnen hat. Die Aufzeichnung wird beendet, das heisst sie kann nicht mehr fortgesetzt werden!
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungEnde(ByVal Zielpfad As String)
        If Not AufzeichnungAktiv Then Exit Sub 'Was machen wir dann ueberhaupt hier?
        AufzeichnungStrW.Flush()
        AufzeichnungStrW.Close()
        Aufzeichnungspfad = Zielpfad
        If My.Computer.FileSystem.FileExists(Aufzeichnungspfad.Replace("\active\", "\") + "_old") Then
            My.Computer.FileSystem.MoveFile(Aufzeichnungspfad.Replace("\active\", "\") + "_old", Aufzeichnungspfad.Replace("\active\", "\") + "_old2", True)
        End If
        If My.Computer.FileSystem.FileExists(Aufzeichnungspfad.Replace("\active\", "\")) Then
            My.Computer.FileSystem.MoveFile(Aufzeichnungspfad.Replace("\active\", "\"), Aufzeichnungspfad.Replace("\active\", "\") + "_old", True)
        End If
        My.Computer.FileSystem.MoveFile(DataSettings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", Aufzeichnungspfad.Replace("\active\", "\"), True)
        AufzeichnungAktiv = False
    End Sub
    Public Shared Sub AufzeichnungAbspielenStart(ByVal Pfad As String)
        If AufzeichnungAbspielen Then AufzeichnungAbspielenAbbruch() 'Na na na. erst das eine beenden, befor man das naechste anfaengt.
        If Not My.Computer.FileSystem.FileExists(Pfad) Then Exit Sub 'In dem Fall haben wir hier nichts mehr zu suchen.
        AufzeichnungLaden = True
        AufzeichnungStrR = New IO.StreamReader(Pfad, Hauptmenue.Codierung)
        Aufzeichnungspfad = Pfad
        Dim Kartenname As String = AufzeichnungStrR.ReadLine
        If Kartenname.ToLower.StartsWith("Kartenname:".ToLower) Then
            Kartenname = Kartenname.Remove(0, Kartenname.IndexOf(":") + 1)

            If Not Kartenname.EndsWith(".map") Then
                Kartenname += DataSettings.Resourcenpfad + "Maps\" + Kartenname + ".map"
            End If
            If Not My.Computer.FileSystem.FileExists(Kartenname) Then
                Dim F() As String = Kartenname.Split("\")
                Dim Found As Boolean = False
                For I = 0 To F.Length - 1
                    If Not Found Then
                        If F(I) = "Karten" Then
                            Found = True
                            Kartenname += DataSettings.Resourcenpfad + F(I) + "\"
                        End If
                    Else
                        If I = F.Length - 1 Then
                            Kartenname += F(I)
                        Else
                            Kartenname += F(I) + "\"
                        End If
                    End If
                Next
                If Not My.Computer.FileSystem.FileExists(Kartenname) Then
                    Kartenname = LoadRandomMapForReplay()
                    If Kartenname.ToLower = "Damaged File".ToLower Then
                        Konsole.Write("Map on which this record is based wasn't found! Open the record and check if the map under ""Kartenname:"" exists")
                        AufzeichnungAbspielenAbbruch()
                        Exit Sub
                    End If
                End If
            End If
            AufzeichnungAbspielen = True
            RecordPosition = 0
            'Erst die Karte laden
            Dim LB As New ObjektLadebildschirm(2, "", Kartenname, False, ".map", False, False)


            Hauptmenue.Ini(Hauptmenue.Formmodi.Spiel, False, True)

            MaxRecordPosition = 0
            While Not AufzeichnungStrR.EndOfStream
                AufzeichnungStrR.ReadLine()
                MaxRecordPosition += 1
            End While

            If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
            End If
            For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).AI_Class IsNot Nothing Then
                    If Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat IsNot Nothing Then
                        Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat.Abort()
                        Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat = Nothing
                    End If
                End If
            Next
            StartSpielfeld = Nothing
            'dann den "unsichtbaren Spieler"
            StartSpielfeld = Objektverwalter.Spielfeld.Clone
            If StartSpielfeld.CurrentAI IsNot Nothing Then
                If StartSpielfeld.CurrentAI.KIThreat IsNot Nothing Then
                    StartSpielfeld.CurrentAI.KIThreat.Abort()
                End If
                StartSpielfeld.CurrentAI.KIThreat = Nothing
            End If
            For I = 0 To StartSpielfeld.Spieler.Length - 1
                If StartSpielfeld.Spieler(I).AI_Class IsNot Nothing Then
                    If StartSpielfeld.Spieler(I).AI_Class.KIThreat IsNot Nothing Then
                        StartSpielfeld.Spieler(I).AI_Class.KIThreat.Abort()
                        StartSpielfeld.Spieler(I).AI_Class.KIThreat = Nothing
                    End If
                End If
            Next

            AufzeichnungAbspielenThreadBeenden() 'nur sicherheitshalber, eigentlich muesste er schon beendet werden.
            AufzeichnungAbspielenThread = New Threading.Thread(AddressOf AufzeichnungAbspielenThreadStarten)
            AufzeichnungAbspielenThread.Name = "Record Thread"
            AufzeichnungAbspielen = True
            AufzeichnungAbspielenThread.Start()


        Else
            Konsole.Write("Damaged File: " + Pfad)
            'Console.WriteLine("Fehlerhafte Datei: " + Pfad)
        End If
    End Sub
    Public Shared Sub AufzeichnungAbspielenAbbruch()
        AufzeichnungStrR.Close()
        AufzeichnungAbspielen = False
    End Sub
    ''' <summary>
    ''' Try to load Map as Random Map.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function LoadRandomMapForReplay() As String
        Dim Z As String = AufzeichnungStrR.ReadLine
        If Z.ToLower = "Use Map Generator".ToLower Then
            Dim Breite As Integer = 0
            Dim Hoehe As Integer = 0
            Dim Spieler As Integer = 0
            Dim Strassen As Boolean = False
            Dim Zufallszahl As Integer = 0
            While Not AufzeichnungStrR.EndOfStream
                Z = AufzeichnungStrR.ReadLine
                If Z.ToLower.StartsWith("breite=") Then
                    Breite = CInt(Z.Split("=")(1))
                    Continue While
                End If
                If Z.ToLower.StartsWith("hoehe=") Then
                    Hoehe = CInt(Z.Split("=")(1))
                    Continue While
                End If
                If Z.ToLower.StartsWith("spieler=") Then
                    Spieler = CInt(Z.Split("=")(1))
                    Continue While
                End If
                If Z.ToLower.StartsWith("road=") Then
                    Strassen = CBool(Z.Split("=")(1))
                    Continue While
                End If
                If Z.ToLower.StartsWith("zufallszahl=") Then
                    Zufallszahl = CInt(Z.Split("=")(1))
                    Continue While
                End If
                If Z.ToLower = "End Random Map Generator".ToLower Then
                    Objektverwalter.ZufallskarteV2(Breite, Hoehe, ObjektKartenauswahlMenue.GetNeueSpieler(Spieler), New ObjektRegeln(Spieler, False), Strassen, Zufallszahl)
                    Objektverwalter.Spielfeld.Kartenname = "Random Map=" + Zufallszahl.ToString
                    If Strassen Then
                        Objektverwalter.Spielfeld.MapPosition = "Use Road Map Generator"
                    Else
                        Objektverwalter.Spielfeld.MapPosition = "Use Map Generator"
                    End If
                    Return "already load this map"
                End If
            End While
        End If
        Return "Damaged File"
    End Function

    Private Shared Sub AufzeichnungWriteHeader(ByVal Aufzeichnungsname As String)
        AufzeichnenZeile("Kartenname:" + Aufzeichnungsname)
        If Objektverwalter.Spielfeld.MapPosition.ToLower = "Use Map Generator".ToLower Then
            AufzeichnenZeile("Use Map Generator")
            AufzeichnenZeile("Breite=" + Objektverwalter.Spielfeld.Breite.ToString)
            AufzeichnenZeile("Hoehe=" + Objektverwalter.Spielfeld.Hoehe.ToString)
            AufzeichnenZeile("Spieler=" + (Objektverwalter.Spielfeld.Spieler.Length - 1).ToString)
            AufzeichnenZeile("Road=False")
            AufzeichnenZeile("Zufallszahl=" + Objektverwalter.Spielfeld.Kartenname.Split("=")(1))
            AufzeichnenZeile("End Random Map Generator")
        ElseIf Objektverwalter.Spielfeld.MapPosition.ToLower = "Use Road Map Generator".ToLower Then
            AufzeichnenZeile("Use Map Generator")
            AufzeichnenZeile("Breite=" + Objektverwalter.Spielfeld.Breite.ToString)
            AufzeichnenZeile("Hoehe=" + Objektverwalter.Spielfeld.Hoehe.ToString)
            AufzeichnenZeile("Spieler=" + (Objektverwalter.Spielfeld.Spieler.Length - 1).ToString)
            AufzeichnenZeile("Road=True")
            AufzeichnenZeile("Zufallszahl=" + Objektverwalter.Spielfeld.Kartenname.Split("=")(1))
            AufzeichnenZeile("End Random Map Generator")
        End If
        AufzeichnenZeile(Objektverwalter.Spielfeld.Regeln.ToString)
        ' AufzeichnenZeile("Spielerzahl:" + (Objektverwalter.Spielfeld.Spieler.Length - 1).ToString)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            AufzeichnenSpieler(I)
        Next



    End Sub
    Private Shared Sub AufzeichnenSpieler(ByVal Spieler As Integer)
        Dim Z As String = "Spieler:" + Objektverwalter.Spielfeld.Spieler(Spieler).Spieler.ToString + "|" + _
        Objektverwalter.Spielfeld.Spieler(Spieler).Team + "|" + _
        Objektverwalter.Spielfeld.Spieler(Spieler).KOS(0).KOID + "|"
        If Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1) IsNot Nothing Then
            Z += Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).KOID + "|"
        Else
            Z += "Nothing|"
        End If
        Z += Objektverwalter.Spielfeld.Spieler(Spieler).FondsproStadt.ToString + "|" + _
        Objektverwalter.Spielfeld.Spieler(Spieler).Fabrikfonds.ToString + "|" '5
        If Objektverwalter.Spielfeld.Spieler(Spieler).GetBauliste Is Nothing Then
            Z += "Nothing|"
        Else
            Z += Objektverwalter.Spielfeld.Spieler(Spieler).GetBauliste.ToString + "|"
        End If
        Z += Objektverwalter.Spielfeld.Spieler(Spieler).Fonds.ToString + "|" + _
        Objektverwalter.Spielfeld.Spieler(Spieler).Farbe.ToArgb.ToString + "|" + Objektverwalter.Spielfeld.Spieler(Spieler).Spielername
        AufzeichnenZeile(Z)
    End Sub
    Private Shared Sub AufzeichnenZeile(ByVal s As String)
        If Not AufzeichnungAktiv Then Exit Sub
        AufzeichnungStrW.WriteLine(s)
        AufzeichnungStrW.Flush()
        If s.Contains("System.Int32[]") Then
            s.ToString()
        End If
    End Sub


    Private Shared Sub AufzeichnungAbspielenThreadStarten()
        If (Not AufzeichnungAbspielen) Or (AufzeichnungStrR Is Nothing) Then
            AufzeichnungAbspielenThreadBeenden()
            Exit Sub
        End If
        RestartAufzeichnungAbspielen()
        AufzeichnungsPause = False

        While AufzeichnungAbspielen
            While Not AufzeichnungStrR.EndOfStream


                NetzBefehlRecieved(AufzeichnungStrR.ReadLine)
                RecordPosition += 1
                Dim VorratsBefehle As Integer = GetVorratsBefehle()
                Do While GetVorratsBefehle() >= 3 Or AufzeichnungsPause
                    Threading.Thread.Sleep(100) 'naja eigentlich muss man das natuerlich so machen, dass einfach immer ein paar Befehle in der Warteschleife sind, aber ich moechte erstmal schauen, obs funktioniert.
                Loop
            End While
            'Einfach schlafen.
            Threading.Thread.Sleep(100)
        End While
    End Sub

    ''' <summary>
    ''' Wir fangen von vorne an Abzuspielen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub RestartAufzeichnungAbspielen()
        Dim OldState As Boolean = AufzeichnungsPause
        AufzeichnungsPause = True
        If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
            If Objektverwalter.Spielfeld.CurrentAI.KIThreat IsNot Nothing Then
                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
            End If
            Objektverwalter.Spielfeld.CurrentAI = Nothing
        End If
        For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).AI_Class IsNot Nothing Then
                If Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat IsNot Nothing Then
                    Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat.Abort()
                    Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat = Nothing
                End If
            End If
        Next
        NetzVorratsBefehle.Clear()
        Dim Scriptname As String = ""
        Objektverwalter.Spielfeld.SpielfeldLocker.Lock()
        Scriptname = ObjektScript.ScriptName
        If StartSpielfeld IsNot Nothing Then
            Objektverwalter.Spielfeld = StartSpielfeld.Clone
            If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
                If Objektverwalter.Spielfeld.CurrentAI.KIThreat IsNot Nothing Then
                    Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                End If
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
                Objektverwalter.Spielfeld.CurrentAI = Nothing
            End If
        End If
        Objektverwalter.Spielfeld.SpielfeldLocker.Unlock()

        If StartSpielfeld IsNot Nothing Then
            If StartSpielfeld.CurrentAI IsNot Nothing Then
                If StartSpielfeld.CurrentAI.KIThreat IsNot Nothing Then
                    StartSpielfeld.CurrentAI.KIThreat.Abort()
                    StartSpielfeld.CurrentAI.KIThreat = Nothing
                End If
            End If
            For I = 0 To StartSpielfeld.Spieler.Length - 1
                If StartSpielfeld.Spieler(I).AI_Class IsNot Nothing Then
                    If StartSpielfeld.Spieler(I).AI_Class.KIThreat IsNot Nothing Then
                        StartSpielfeld.Spieler(I).AI_Class.KIThreat.Abort()
                        StartSpielfeld.Spieler(I).AI_Class.KIThreat = Nothing
                    End If
                End If
            Next
        End If
        AufzeichnungStrR = New IO.StreamReader(Aufzeichnungspfad)
        AufzeichnungStrR.ReadLine()
        Dim Line As String = Hauptmenue.AufzeichnungStrR.ReadLine
        If Line.ToLower = "Use Map Generator".ToLower Then
            While Line.ToLower <> "end random map generator"
                Line = Hauptmenue.AufzeichnungStrR.ReadLine
            End While
            Line = Hauptmenue.AufzeichnungStrR.ReadLine
        End If
        Objektverwalter.Spielfeld.Regeln = New ObjektRegeln(Line.Split("|"))
        Line = Hauptmenue.AufzeichnungStrR.ReadLine
        For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If i <> 1 Then
                Line = Hauptmenue.AufzeichnungStrR.ReadLine
            End If
            If RecordPosition = 0 Then
                Dim sSp() As String = Line.Remove(0, Line.IndexOf(":") + 1).Split("|")
                Dim KO As ObjektKO = ObjektLadeklasse.NewKO(sSp(2), i)
                Dim B As Bauliste = Nothing
                If sSp(6).ToLower <> "nothing" Then
                    B = New Bauliste(sSp(6).Split("_"))
                End If
                Objektverwalter.Spielfeld.Spieler(i) = New ObjektSpieler(sSp(0), Color.FromArgb(CInt(sSp(8))), sSp(4), New ObjektKO() {KO, ObjektLadeklasse.NewKO(sSp(3), i)}, sSp(7), KO.Armee, sSp(1), B, ObjektSpieler.KIStufen.Passiv, sSp(5))
                If sSp.Length > 9 Then
                    Objektverwalter.Spielfeld.Spieler(i).Spielername = sSp(9)
                End If
            End If
        Next
        RecordPosition = 0
        If Scriptname <> "" Then
            ObjektScript.NeuScript(Scriptname, True)
        End If
        Objektverwalter.Spielfeld.AktuellerSpieler = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Regeln.Startspieler)
        Objektverwalter.Spielfeld.SpielStart()

        AufzeichnungsPause = OldState
    End Sub
    ''' <summary>
    ''' Geht zur Aufzeichnungsposition.
    ''' </summary>
    ''' <param name="NewPosition"></param>
    ''' <remarks></remarks>
    Public Shared Sub GotoRecordPosition(ByVal NewPosition As Integer)
        If NewPosition = RecordPosition Then Exit Sub
        Dim OldState As Boolean = AufzeichnungsPause
        AufzeichnungsPause = True
        While AufzeichnungAbspielenThread.ThreadState <> Threading.ThreadState.WaitSleepJoin
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        If NewPosition > MaxRecordPosition Then
            NewPosition = MaxRecordPosition
        End If
        Dim OldOrders As New List(Of KINetzwerkBefehl)
        If NewPosition < RecordPosition Then
            RestartAufzeichnungAbspielen()
        ElseIf NewPosition >= RecordPosition Then
            Objektverwalter.Spielfeld.CurrentAI.KIKonsolenPause = True
            While (CType(Objektverwalter.Spielfeld.CurrentAI, KIPassivNetzwerk).DoesOrder)
                Threading.Thread.Sleep(ThreadSleepTime)
            End While
            If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
                OldOrders.AddRange(CType(Objektverwalter.Spielfeld.CurrentAI, KIPassivNetzwerk).Befehle)
                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
                Objektverwalter.Spielfeld.CurrentAI = Nothing
            End If
            For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).AI_Class IsNot Nothing Then
                    If Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat IsNot Nothing Then
                        Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat.Abort()
                        Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat = Nothing
                    End If
                End If
            Next
            If NetzVorratsBefehle.Count > 0 Then
                OldOrders.AddRange(NetzVorratsBefehle)
            End If
        End If
        While Objektverwalter.Spielfeld.CurrentAI Is Nothing
            If AufzeichnungsPause Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.AI_Class Is Nothing Then
                    Objektverwalter.Spielfeld.AktuellerSpieler.AI_Class = ObjektLadeklasse.NewKI(Objektverwalter.Spielfeld.AktuellerSpieler)
                End If
                'Ein neues KI Objekt erzeugen
                Objektverwalter.Spielfeld.CurrentAI = Objektverwalter.Spielfeld.AktuellerSpieler.AI_Class
                If Objektverwalter.Spielfeld.CurrentAI.KIThreat IsNot Nothing Then
                    Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                End If
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
            Else
                Threading.Thread.Sleep(5)
            End If
        End While

        Aufzeichnungsspulen = True
        For I = 0 To OldOrders.Count - 1
            CType(Objektverwalter.Spielfeld.CurrentAI, KIPassivNetzwerk).DoOrder(OldOrders(I))
        Next
        OldOrders.Clear()
        For I = RecordPosition To NewPosition - 1
            CType(Objektverwalter.Spielfeld.CurrentAI, KIPassivNetzwerk).DoOrder(GetOrder(AufzeichnungStrR.ReadLine))
            RecordPosition += 1
        Next
        Aufzeichnungsspulen = False
        AufzeichnungsPause = OldState
        If Objektverwalter.Spielfeld.AktuellerSpieler.AI_Class Is Nothing Then
            Objektverwalter.Spielfeld.AktuellerSpieler.AI_Class = ObjektLadeklasse.NewKI(Objektverwalter.Spielfeld.AktuellerSpieler)
        End If
        Objektverwalter.Spielfeld.CurrentAI = Objektverwalter.Spielfeld.AktuellerSpieler.AI_Class
        Objektverwalter.Spielfeld.CurrentAI.LaunchAI()
    End Sub
    Private Shared Function GetOrder(ByVal line As String) As KINetzwerkBefehl
        Dim sInfo() As String = line.Split("|") 'auseinander nehmen und dann bearbeiten
        Select Case sInfo(0).ToLower
            Case "Befehl1".ToLower
                Return (New KINetzwerkBefehl(CInt(sInfo(1)), CInt(sInfo(2)), CInt(sInfo(3)), ToIntArry(sInfo(4).Split("$")), ToIntArry(sInfo(5).Split("$")), CInt(sInfo(6)), CInt(sInfo(7)), CSng(sInfo(8)), CSng(sInfo(9)), CInt(sInfo(10))))
            Case "Befehl0".ToLower
                Select Case sInfo(1).ToLower
                    Case "Wetter".ToLower
                        'Eine Wetteraenderung, wie interressant :)
                        If sInfo.Length > 3 Then
                            Return (New KINetzwerkBefehl(ObjektKI.KIModiExtern.WetterWechsel, CInt(sInfo(2)), 0, Nothing, Nothing, -1, -1, 0, 0, CInt(sInfo(3))))
                        Else
                            Return (New KINetzwerkBefehl(ObjektKI.KIModiExtern.WetterWechsel, CInt(sInfo(2)), 0, Nothing, Nothing, -1, -1, 0, 0, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler))
                        End If
                    Case "SchlachtWechsel".ToLower
                        Return (New KINetzwerkBefehl(ObjektKI.KIModiExtern.Schlachtwechseln, 0, 0, New Integer() {0}, New Integer() {0}, 0, 0, 0, 0, sInfo(2)))
                    Case "Wolkenbewegen".ToLower
                        Return (New KINetzwerkBefehl(ObjektKI.KIModiExtern.WolkeBewegen, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), 0, 0, 0))
                    Case "vulkan"
                        'Der Vulkan auf dieser Karte speit Feuer wie unguenstig
                        Dim Ziele(sInfo.Length - 5) As Point
                        For I = 4 To sInfo.Length - 1
                            Ziele(I - 4) = CPoint(sInfo(I))
                        Next
                        Dim WegX(Ziele.Length - 1) As Integer
                        Dim WegY(Ziele.Length - 1) As Integer
                        For I = 0 To Ziele.Length - 1
                            WegX(I) = Ziele(I).X
                            WegY(I) = Ziele(I).Y
                        Next
                        Return (New KINetzwerkBefehl(ObjektKI.KIModiExtern.VulkanFeuer, sInfo(2), sInfo(3), WegX, WegY, 0, 0, 0, 0, 0))
                    Case "verbessern"
                        Return (New KINetzwerkBefehl(ObjektKI.KIModiExtern.EinheitVerbessern, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), sInfo(6), 0, 0))
                    Case "treibstoff"
                        Return (New KINetzwerkBefehl(ObjektKI.KIModiExtern.EinheitTreibstoffSetzen, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), 0, 0, 0))
                End Select
        End Select
        Return Nothing
    End Function
    Private Shared Function GetVorratsBefehle() As Integer
        Dim Count As Integer = NetzVorratsBefehle.Count
        If Objektverwalter.Spielfeld IsNot Nothing Then
            If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
                If TypeOf Objektverwalter.Spielfeld.CurrentAI Is KIPassivNetzwerk Then
                    Dim AI As KIPassivNetzwerk = Objektverwalter.Spielfeld.CurrentAI
                    Count += AI.Befehle.Count
                End If
            End If
        Else
            Return 0
        End If
        Return Count
    End Function
    ''' <summary>
    ''' Beendet alles was mit der Aufzeichnung zu tun hat.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungAbspielenThreadBeenden()
        If AufzeichnungAbspielenThread Is Nothing Then Exit Sub 'Arbeit getan wuerde ich sagen ;)
        If StartSpielfeld IsNot Nothing Then
            If StartSpielfeld.CurrentAI IsNot Nothing Then
                If StartSpielfeld.CurrentAI.KIThreat IsNot Nothing Then
                    StartSpielfeld.CurrentAI.KIThreat.Abort()
                    StartSpielfeld.CurrentAI.KIThreat = Nothing
                End If
            End If
            For I = 0 To StartSpielfeld.Spieler.Length - 1
                If StartSpielfeld.Spieler(I).AI_Class IsNot Nothing Then
                    If StartSpielfeld.Spieler(I).AI_Class.KIThreat IsNot Nothing Then
                        StartSpielfeld.Spieler(I).AI_Class.KIThreat.Abort()
                        StartSpielfeld.Spieler(I).AI_Class.KIThreat = Nothing
                    End If
                End If
            Next
        End If
        StartSpielfeld = Nothing
        If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
            If Objektverwalter.Spielfeld.CurrentAI.KIThreat IsNot Nothing Then
                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
            End If
        End If
        For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).AI_Class IsNot Nothing Then
                If Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat IsNot Nothing Then
                    Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat.Abort()
                    Objektverwalter.Spielfeld.Spieler(I).AI_Class.KIThreat = Nothing
                End If
            End If
        Next
        AufzeichnungAbspielenThread.Abort()
        AufzeichnungAbspielenAbbruch()
        NetzVorratsBefehle.Clear()
    End Sub
#End Region

#Region "Change Window States"
    Shared AlteGroesse As Size
    Shared AutoResize As Boolean = True
    Private Sub MainForm_ResizeBegin(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ResizeBegin
        AlteGroesse = MainMenue.Size
        Do While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        Loop
        AutoResize = False
        Grafikengine.ResizingDrawBreak = True

    End Sub
    Private Sub MainForm_ResizeEnd(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ResizeEnd

        SizeHasChanged()
        Grafikengine.ResizingDrawBreak = False
        AutoResize = True
    End Sub
    Private Sub SizeHasChanged()
        BildschirmGroesseveraendern(Me.Size.Width, Me.Size.Height)
        Hauptmenue.Rechteck = New Rectangle(0, 0, DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
        Dim NewSize As Size = MainMenue.Size
        NewSize = NewSize - AlteGroesse
        If Not Objektverwalter.Menue Is Nothing Then
            Objektverwalter.Menue.ChangeWindowSize(New Point(NewSize.Width, NewSize.Height))
        End If
        If ObjektLadebildschirm.Ladebildschirm IsNot Nothing Then
            ObjektLadebildschirm.Ladebildschirm.ChangeWindowSize(New Point(NewSize.Width, NewSize.Height))
        End If
        ObjektKODialog.ChangeWindowSize(New Point(NewSize.Width, NewSize.Height))
        DataSettings.BildschirmBreite = MainMenue.Size.Width - Rand.X * 2
        DataSettings.BildschirmHoehe = MainMenue.Size.Height - Rand.Y - Rand.X

        DataSettings.MySettingsIniSave()
        'Werte reparieren.
        Grafikengine.SCREENWIDTH = DataSettings.BildschirmBreite
        Grafikengine.SCREENHEIGHT = DataSettings.BildschirmHoehe
        ReIniMenue()
        Grafikengine.InitDeviceValues()
    End Sub
    ''' <summary>
    ''' Wechselt vom FensterModus in den Vollbild und umgekehrt.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub ChangeWindowMode(Optional ByVal StandardResolution As Boolean = False)
        If Grafikengine.ChangeWindowState Then
            If DataSettings.Fenstermodus Then
                Rand = FensterRand
                If StandardResolution Then
                    DataSettings.BildschirmBreite = 800
                    DataSettings.BildschirmHoehe = 600
                Else
                    DataSettings.BildschirmBreite = Hauptmenue.MainMenue.Size.Width - Rand.X * 2
                    DataSettings.BildschirmHoehe = Hauptmenue.MainMenue.Size.Height - Rand.Y - Rand.X
                End If
                DataSettings.MySettingsIniSave()
                Hauptmenue.MainMenue.FormBorderStyle = ChangeFormBorderStyle()

                Hauptmenue.MainMenue.Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
            Else
                Hauptmenue.MainMenue.Location = New Point
                Hauptmenue.MainMenue.FormBorderStyle = ChangeFormBorderStyle()
                Rand = New Point
                DataSettings.BildschirmBreite = Manager.Adapters(DataSettings.Adapter).CurrentDisplayMode.Width
                DataSettings.BildschirmHoehe = Manager.Adapters(DataSettings.Adapter).CurrentDisplayMode.Height
                DataSettings.MySettingsIniSave()
                'Hauptmenue.MainMenue.Size = New Size
                ' Hauptmenue.MainMenue.Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
                Hauptmenue.MainMenue.Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)
            End If
            ReIniMenue()
        End If
    End Sub
    ''' <summary>
    ''' Die Fenster groesse hat sich geaendert 3D Engine anpassen.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Hauptmenue_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged

    End Sub
    Public Shared Function ChangeFormBorderStyle() As Windows.Forms.FormBorderStyle
        If DataSettings.Fenstermodus Then
            'Sizable waere schoen muss noch nach dem Fehler suchen.
            Return Windows.Forms.FormBorderStyle.Sizable
        Else
            Return Windows.Forms.FormBorderStyle.None
        End If
    End Function
    ''' <summary>
    ''' Versucht das Menue neu zu erstellen um evtl. Bildschirm Veraenderungen zu uebernehmen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub ReIniMenue()
        Select Case Formmodus
            Case Formmodi.Editor 'Would produce no good Results
            Case Formmodi.Spiel 'Would produce no good Results
            Case Formmodi.KartenauswahlMP 'Would produce no good Results
            Case Formmodi.SiegMenue 'Would produce no good Results
            Case Formmodi.Kartenauswahl 'Would produce no good Results
            Case Formmodi.LandkartenAuswahlKAMP 'Would produce no good Results
            Case Else
                If ObjektLadebildschirm.Ladebildschirm Is Nothing Then
                    Ini(Formmodus)
                End If
        End Select
    End Sub
#End Region

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Const WM_SYSCOMMAND As Integer = &H112I
        Const SC_MINIMIZE As Integer = &HF020I
        Const SC_MAXIMIZE As Integer = &HF030I
        Const SC_CLOSE As Integer = &HF060I

        If ShowInTaskbar = False Then
            If (m.Msg = WM_SYSCOMMAND AndAlso m.WParam = CType(SC_MINIMIZE, IntPtr)) Then
                'Do whatever you need...
                'See above...
                Me.Visible = False
                If DataSettings.TaskAnzeigenModus = TaskleistenAnzeige.Versteckt Then Winterschlaf()
                If Me.Visible Then
                    Hauptmenue.MainMenue.UpdateStart.Start()
                End If
                Exit Sub
            End If
            If (m.Msg = WM_SYSCOMMAND AndAlso m.WParam = CType(SC_MAXIMIZE, IntPtr)) Then
                'See above...
                Me.Visible = False
                If DataSettings.TaskAnzeigenModus = TaskleistenAnzeige.Versteckt Then Winterschlaf()
                Exit Sub
            End If
            If (m.Msg = WM_SYSCOMMAND AndAlso m.WParam = CType(SC_CLOSE, IntPtr)) Then
                'Close prevent
                'Return einfach irgendwie exit sub, ohne das eben unten das MyBase.WndProc(m) aufgerufen wird. Wenn wir's hier abfangen, dann wird das wohl nie beendet werden!
                '
                'See above...
                Me.Visible = False
                If DataSettings.TaskAnzeigenModus = TaskleistenAnzeige.Versteckt Then Winterschlaf()
                Exit Sub
            End If
        End If
        'Fuer das normale einfach die Funktion aufrufen mit SizeChanged. Generell kann man dann ja..
        'if Me.WindowState = FormWindowState.Normal then

        MyBase.WndProc(m)
    End Sub
    Private Sub Winterschlaf()
        Dim Code() As Keys = {Keys.C, Keys.O, Keys.M, Keys.M, Keys.A, Keys.N, Keys.D, Keys.E, Keys.R, Keys.Space, Keys.W, Keys.A, Keys.R, Keys.S}
        Dim Ind As Integer = 0
        Do
            Threading.Thread.Sleep(1000)
            If getTasteGedrueckt(Code(Ind)) Then
                Ind += 1
                If Ind >= Code.Length Then
                    Visible = True
                    Exit Sub
                End If
            Else
                Ind = 0
            End If
        Loop
    End Sub

    ''' <summary>
    ''' Creates a Screenshot of our game.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub ScreenToPicture()
        StartCreatingObjects()
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While
        Try
            'Vorbereitung der Variablen.
            Dim currentScreenSize As Size = New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)

            Dim ScreenToBitmap As New Bitmap(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe)

            Dim gGraphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(ScreenToBitmap)
            'Screenshot erstellen
            gGraphics.CopyFromScreen(MainMenue.Location + New Point(Rand.X, Rand.Y), New Point, New Size(DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe))

            Dim Location As String = DataSettings.Resourcenpfad
            Location = Location.Remove(Location.LastIndexOf("\"))
            Location = Location.Remove(Location.LastIndexOf("\")) + "\Screenshots\"

            If Not My.Computer.FileSystem.DirectoryExists(Location) Then
                My.Computer.FileSystem.CreateDirectory(Location)
            End If
            Location += "Screenshot_"
            Dim I As Long = 0 'Einfach zum Spass.
            While My.Computer.FileSystem.FileExists(Location + I.ToString + ".png")
                I += 1
            End While
            'Screenshot speichern.
            ScreenToBitmap.Save(Location + I.ToString + ".png", System.Drawing.Imaging.ImageFormat.Png)

        Catch ex As Exception
            Konsole.Write("Unable to create Screenshot: " + ex.ToString)
        End Try
        EndCreatingObjects()
    End Sub

#Region "Converter"
    Public Sub ConvertBmpIntoPngAllInDirectory(ByVal Pfad As String)
        For Each File In My.Computer.FileSystem.GetFiles(Pfad, FileIO.SearchOption.SearchAllSubDirectories, "*.bmp")
            ConvertBMPintoPNG(File)
        Next
    End Sub
    Private Sub ConvertBMPintoPNG(ByVal File As String)
        Dim Image As Image = Image.FromFile(File)
        Image.Save(File.Replace(".bmp", ".png"), System.Drawing.Imaging.ImageFormat.Png)
        Image.Dispose()
        My.Computer.FileSystem.DeleteFile(File)
    End Sub


    ''' <summary>
    ''' Erschafft eine Maske fuer alle Bilder im Ordner!
    ''' Top Level Only
    ''' </summary>
    ''' <param name="Directory"></param>
    ''' <remarks></remarks>
    Public Shared Sub CreateAllMasks(ByVal Directory As String)
        For Each File In My.Computer.FileSystem.GetFiles(Directory, FileIO.SearchOption.SearchTopLevelOnly, "*.png")
            CreateMask(File)
        Next
    End Sub
    ''' <summary>
    ''' Erschafft eine Maske fuer alle Bilder im Ordner!
    ''' Top Level Only
    ''' </summary>
    ''' <param name="Directory"></param>
    ''' <remarks></remarks>
    Public Shared Sub CreateAllMasksSubDirectory(ByVal Directory As String)
        For Each File In My.Computer.FileSystem.GetFiles(Directory, FileIO.SearchOption.SearchAllSubDirectories, "*.png")
            CreateMask(File)
        Next
    End Sub
    ''' <summary>
    ''' Erstellt eine Maske zu einer Einheit!
    ''' </summary>
    ''' <param name="File"></param>
    ''' <remarks></remarks>
    Public Shared Sub CreateMask(ByVal File As String)
        Dim B As Bitmap = Image.FromFile(File)
        Dim Maske As Image = New Bitmap(B.Width, B.Height, Drawing.Imaging.PixelFormat.Format32bppArgb)
        For I = 0 To My.Resources.Neutral.Width - 1
            Dim MomFarbe As Color = My.Resources.Neutral.GetPixel(I, 0)
            Dim EinFaerbung As Color = My.Resources._NeutralGrau.GetPixel(I, 0)
            For X = 0 To B.Width - 1
                For Y = 0 To B.Height - 1
                    If B.GetPixel(X, Y) = MomFarbe Then
                        B.SetPixel(X, Y, Color.Transparent)
                        CType(Maske, Bitmap).SetPixel(X, Y, EinFaerbung)
                    End If
                Next
            Next
        Next
        Maske = Grafikengine.Pixelneueinfaerben(Maske, Color.Black, Color.Transparent)
        Maske.Save(File.ToLower.Replace(".png", "+Maske.png"), Drawing.Imaging.ImageFormat.Png)
        'Etwas kompliziert ich weiss!
        Dim B1 As Image = New Bitmap(B.Width, B.Height, Drawing.Imaging.PixelFormat.Format32bppArgb)
        For X = 0 To B.Width - 1
            For Y = 0 To B.Height - 1
                If B.GetPixel(X, Y) <> Color.Transparent Then
                    CType(B1, Bitmap).SetPixel(X, Y, B.GetPixel(X, Y))
                End If
            Next
        Next
        B.Dispose()
        B1.Save(File, Drawing.Imaging.ImageFormat.Png)
    End Sub

    Public Shared Sub UpdateAIinIni(ByVal CampaignFolder As String, ByVal AI As ObjektSpieler.KIStufen, Optional ByVal OnlyAI As ObjektSpieler.KIStufen = -1)
        For Each IniFile In My.Computer.FileSystem.GetFiles(CampaignFolder, FileIO.SearchOption.SearchTopLevelOnly, "*.ini")
            Using R As New IO.StreamReader(IniFile, Hauptmenue.Codierung, True)
                Using W As New IO.StreamWriter(DataSettings.Resourcenpfad + "Ini.tmp", False, Hauptmenue.Codierung)
                    While Not R.EndOfStream
                        Dim Z As String = R.ReadLine
                        If Z.StartsWith("KI|") Then
                            Dim s() As String = Z.Split("|")
                            If CInt(s(2)) <> ObjektSpieler.KIStufen.Mensch Then
                                If OnlyAI >= ObjektSpieler.KIStufen.Mensch Then
                                    If CInt(s(2)) = OnlyAI Then
                                        W.WriteLine("KI|" + s(1) + "|" + CInt(AI).ToString)
                                    End If
                                Else
                                    W.WriteLine("KI|" + s(1) + "|" + CInt(AI).ToString)
                                End If
                            Else
                                W.WriteLine(Z)
                            End If
                        End If
                    End While
                End Using
            End Using
            My.Computer.FileSystem.MoveFile(DataSettings.Resourcenpfad + "Ini.tmp", IniFile, True)
        Next
    End Sub
    Public Shared Sub UpdateAIMaps(ByVal Directory As String, ByVal SubDirectories As Boolean, ByVal AIPlayer1 As ObjektSpieler.KIStufen, ByVal AIOtherPlayer As ObjektSpieler.KIStufen)
        Dim SOption As FileIO.SearchOption
        If SubDirectories Then
            SOption = FileIO.SearchOption.SearchAllSubDirectories
        Else
            SOption = FileIO.SearchOption.SearchTopLevelOnly
        End If
        For Each File In My.Computer.FileSystem.GetFiles(Directory, SOption, New String() {"*.map"})
            Try
                Dim neuesSpielfeld As ObjektSpielfeld
                Using Stream As New IO.FileStream(File, IO.FileMode.Open, IO.FileAccess.Read)
                    Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                    neuesSpielfeld = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                End Using
                For I = 1 To neuesSpielfeld.Spieler.Length - 1
                    If I = 1 Then
                        neuesSpielfeld.Spieler(I).KIStufe = AIPlayer1
                    Else
                        neuesSpielfeld.Spieler(I).KIStufe = AIOtherPlayer
                    End If
                Next
                Using Stream As New IO.FileStream(File, IO.FileMode.Create, IO.FileAccess.Write)
                    Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                    Konverter.Serialize(Stream, neuesSpielfeld)
                End Using
            Catch ex As Exception
                Konsole.Write("Map File: " + File + " is damaged or no CoW-Map.")
            End Try
        Next
    End Sub

    Public Shared Function CStringColor(ByVal S As String) As Color
        Select Case S.ToLower
            Case "orange.bmp"
                Return Hauptmenue.AlleFarbtabellen(0)
            Case "blau.bmp"
                Return Hauptmenue.AlleFarbtabellen(1)
            Case "gruen.bmp"
                Return Hauptmenue.AlleFarbtabellen(2)
            Case "gelb.bmp"
                Return Hauptmenue.AlleFarbtabellen(3)
            Case "schwarz.bmp"
                Return Hauptmenue.AlleFarbtabellen(4)
            Case "metall.bmp"
                Return Hauptmenue.AlleFarbtabellen(6)
            Case "gelbbraun.bmp"
                Return Hauptmenue.AlleFarbtabellen(7)
            Case "orangegelb"
                Return Hauptmenue.AlleFarbtabellen(8)
            Case "jade.bmp"
                Return Hauptmenue.AlleFarbtabellen(9)
            Case "lila.bmp"
                Return Hauptmenue.AlleFarbtabellen(10)
            Case "tuerkise.bmp"
                Return Hauptmenue.AlleFarbtabellen(11)
            Case "violet.bmp"
                Return Hauptmenue.AlleFarbtabellen(12)
            Case "dunkelblau.bmp"
                Return Hauptmenue.AlleFarbtabellen(13)
            Case "dunkelbraun.bmp"
                Return Hauptmenue.AlleFarbtabellen(14)
            Case "dunkelgruen.bmp"
                Return Hauptmenue.AlleFarbtabellen(15)
            Case "dunkelrosa.bmp"
                Return Hauptmenue.AlleFarbtabellen(16)
            Case "dunkelschwarz.bmp"
                Return Hauptmenue.AlleFarbtabellen(5)
            Case Else
                Return Hauptmenue.AlleFarbtabellen(Zufallszahl(0, Hauptmenue.AlleFarbtabellen.Length - 1))
        End Select
    End Function
    Public Shared Sub CreateCode()
        For Each F In My.Computer.FileSystem.GetFiles(DataSettings.Resourcenpfad, FileIO.SearchOption.SearchAllSubDirectories, New String() {"*.lng", "*.kot", "*.ini", "*.gramm", "*.script", "*.txt"})
            Using StrR As New IO.StreamReader(F, True)
                Using StrW As New IO.StreamWriter(DataSettings.Resourcenpfad + "T.tmp")
                    While Not StrR.EndOfStream
                        StrW.WriteLine(StrR.ReadLine)
                    End While
                End Using
            End Using
            My.Computer.FileSystem.MoveFile(DataSettings.Resourcenpfad + "T.tmp", F, True)
        Next
    End Sub

    Public Shared Sub ChangeLetter(ByVal Folder As String)
        If Not Folder.EndsWith("\") Then Folder += "\"
        For Each F In My.Computer.FileSystem.GetDirectories(Folder, FileIO.SearchOption.SearchAllSubDirectories)
            If My.Computer.FileSystem.DirectoryExists(F) Then
                Dim N As String = F.Replace(DataSettings.Resourcenpfad, "")
                Dim S() As String = N.Split("\")
                N = ReplcaceGermanLetters(S(S.Length - 1))
                If N <> S(S.Length - 1) Then
                    My.Computer.FileSystem.RenameDirectory(Folder, N)
                End If
            End If
        Next
        For Each File In My.Computer.FileSystem.GetFiles(Folder, FileIO.SearchOption.SearchAllSubDirectories)
            Dim N As String = File.Replace(DataSettings.Resourcenpfad, "")
            Dim S() As String = N.Split("\")
            N = ReplcaceGermanLetters(S(S.Length - 1))
            If N <> S(S.Length - 1) Then
                My.Computer.FileSystem.RenameFile(File, N)
            End If
        Next

    End Sub

    Public Sub UpdateFiles(ByVal Folder As String)
        For Each F In My.Computer.FileSystem.GetFiles(Folder, FileIO.SearchOption.SearchAllSubDirectories)

        Next
    End Sub

    Public Shared Sub createColorTables(ByVal folder As String, ByVal sourcefile As String)

        If My.Computer.FileSystem.DirectoryExists(folder) Then
            Dim Img As Bitmap = Nothing
            Dim sourcefilename As String = sourcefile
            If My.Computer.FileSystem.FileExists(sourcefile) Then
                sourcefilename = sourcefile
                Img = Image.FromFile(sourcefile)
            ElseIf My.Computer.FileSystem.FileExists(folder + sourcefile) Then
                Img = Image.FromFile(folder + sourcefile)
                sourcefilename = folder + sourcefile
            Else
                Exit Sub
            End If
            Dim Points As New List(Of Point)
            Dim Colors As New List(Of Color)
            For X = 0 To Img.Width - 1
                For Y = 0 To Img.Height - 1
                    Dim C As Color = Img.GetPixel(X, Y)
                    If C.A <> 0 Then
                        Dim Found As Boolean = False
                        For I = 0 To Colors.Count - 1
                            If Colors(I).A = C.A And Colors(I).R = C.R And Colors(I).B = C.B And Colors(I).G = C.G Then
                                Found = True
                                Exit For
                            End If
                        Next
                        If Not Found Then
                            Points.Add(New Point(X, Y))
                            Colors.Add(C)
                        End If
                    End If
                Next
            Next
            Img.Dispose()
            Dim TablesNumber As Integer = My.Computer.FileSystem.GetFiles(folder).Count - 2
            Dim Tables(TablesNumber) As List(Of Color)
            Dim I2 As Integer = 0
            For Each file In My.Computer.FileSystem.GetFiles(folder)
                If Not file.ToLower.EndsWith(sourcefile.ToLower) Then
                    Dim Img2 As Bitmap = Image.FromFile(file)
                    Tables(I2) = New List(Of Color)
                    For I = 0 To Colors.Count - 1
                        If Points(I).X < Img2.Width And Points(I).Y < Img2.Height Then
                            Tables(I2).Add(Img2.GetPixel(Points(I).X, Points(I).Y))
                        Else
                            Tables(I).Add(Color.White)
                        End If
                    Next
                    Img2.Dispose()
                    I2 += 1
                End If
            Next
            Dim Table As New Bitmap(Colors.Count, Tables.Count + 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
            For I = 0 To Tables.Count
                If I = 0 Then
                    For X = 0 To Colors.Count - 1
                        Table.SetPixel(X, I, Colors(X))
                    Next
                Else
                    For X = 0 To Colors.Count - 1
                        Table.SetPixel(X, I, Tables(I - 1)(X))
                    Next
                End If
            Next
            If sourcefilename.EndsWith(".gif") Then
                Table.Save(sourcefilename.Replace(".gif", ".png"), System.Drawing.Imaging.ImageFormat.Png)
            ElseIf sourcefilename.EndsWith(".png") Then
                Table.Save(sourcefilename.Replace(".png", ".tbl"), System.Drawing.Imaging.ImageFormat.Png)
            Else
                Table.Save(sourcefilename.Replace(".bmp", ".png"), System.Drawing.Imaging.ImageFormat.Png)
            End If

            Table.Dispose()
        End If
    End Sub

    Public Shared Sub UpdateMaps(ByVal Folder As String, ByVal Search As FileIO.SearchOption, Optional ByVal CreateBackup As Boolean = False)
        For Each File In My.Computer.FileSystem.GetFiles(Folder, Search, "*.map")
            If CreateBackup Then
                If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "Map Backup\") Then
                    My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "Map Backup\")
                End If
                My.Computer.FileSystem.CopyFile(File, DataSettings.Resourcenpfad + "Map Backup\" + File.Split("\")(File.Split("\").Length - 1), True)
            End If
            Dim Map As ObjektSpielfeld = KarteDefaultLaden(File)
            My.Computer.FileSystem.DeleteFile(File)
            Speichern(File, , Map, True)
        Next
    End Sub
    Public Shared Sub UpdateMap(ByVal File As String, Optional ByVal CreateBackup As Boolean = False)
        If My.Computer.FileSystem.FileExists(File) Then
            If CreateBackup Then
                If Not My.Computer.FileSystem.DirectoryExists(DataSettings.Resourcenpfad + "Map Backup\") Then
                    My.Computer.FileSystem.CreateDirectory(DataSettings.Resourcenpfad + "Map Backup\")
                End If
                My.Computer.FileSystem.CopyFile(File, DataSettings.Resourcenpfad + "Map Backup\" + File.Split("\")(File.Split("\").Length - 1))
            End If
            Dim Map As ObjektSpielfeld = KarteDefaultLaden(File)
            My.Computer.FileSystem.DeleteFile(File)
            Speichern(File, , Map, True)
        End If
    End Sub

    Public Shared Sub ComicalSheet(ByVal File As String, Optional ByVal PixelWidth As Integer = 20, Optional ByVal Optimierungszahl As Integer = 1)
        If My.Computer.FileSystem.FileExists(File) Then
            Dim Org As Bitmap = Image.FromFile(File)
            Dim Upd As Bitmap = Nothing
            For O = 1 To Optimierungszahl
                Upd = New Bitmap(Org.Width, Org.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
                Dim UsedColors As New List(Of Color)
                For X = 0 To Org.Width - 1
                    For Y = 0 To Org.Height - 1
                        If Org.GetPixel(X, Y).A < 255 Then
                            Upd.SetPixel(X, Y, Color.FromArgb(0, 0, 0, 0))
                        Else
                            If Not UsedColors.Contains(Org.GetPixel(X, Y)) Then
                                Dim MomC As Color = Org.GetPixel(X, Y)
                                UsedColors.Add(Org.GetPixel(X, Y))
                                Dim Colors As New List(Of Color)
                                Colors.Add(MomC)
                                For X1 = 0 To Org.Width - 1
                                    For Y1 = 0 To Org.Height - 1
                                        If Org.GetPixel(X1, Y1).A = 255 Then
                                            If Org.GetPixel(X1, Y1).R < MomC.R + PixelWidth And Org.GetPixel(X1, Y1).R > MomC.R - PixelWidth Then
                                                If Org.GetPixel(X1, Y1).G < MomC.G + PixelWidth And Org.GetPixel(X1, Y1).G > MomC.G - PixelWidth Then
                                                    If Org.GetPixel(X1, Y1).B < MomC.B + PixelWidth And Org.GetPixel(X1, Y1).B > MomC.B - PixelWidth Then
                                                        If Not Colors.Contains(Org.GetPixel(X1, Y1)) Then
                                                            Colors.Add(Org.GetPixel(X1, Y1))
                                                        End If
                                                    End If
                                                End If
                                            End If
                                        End If
                                    Next
                                Next
                                Dim R As UInt64 = 0
                                Dim G As UInt64 = 0
                                Dim B As UInt64 = 0
                                For I = 0 To Colors.Count - 1
                                    R += Colors(I).R
                                    G += Colors(I).G
                                    B += Colors(I).B
                                Next
                                MomC = Color.FromArgb(255, R / Colors.Count, G / Colors.Count, B / Colors.Count)
                                For X1 = 0 To Org.Width - 1
                                    For Y1 = 0 To Org.Height - 1
                                        If Colors.Contains(Org.GetPixel(X1, Y1)) Then
                                            Upd.SetPixel(X1, Y1, MomC)
                                        End If
                                    Next
                                Next
                                UsedColors.AddRange(Colors)
                            End If
                        End If
                    Next
                Next
                UsedColors.Clear()
                Org.Dispose()
                Org = Upd.Clone
                If O <> Optimierungszahl Then
                    Upd.Dispose()
                End If
            Next
            If Upd IsNot Nothing Then
                Upd.Save(File.Replace(".", "_v1."))
            End If
        End If
    End Sub

    Public Shared Sub SplitPicture(ByVal File As String, ByVal Size As Integer, Optional ByVal HeightMulti As Integer = 1)
        If My.Computer.FileSystem.FileExists(File) Then
            If Size > 0 Then
                Dim Picture As Bitmap = Image.FromFile(File)
                Dim Width As Integer = Picture.Width / Size
                Dim Height As Integer = Picture.Height / (Size * HeightMulti)
                Dim I As Integer = 0
                Dim Filename As String = File.Split(".")(0)
                For Y = 0 To Height - 1
                    For X = 0 To Width - 1
                        Dim Pic As New Bitmap(Size, Size * HeightMulti, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
                        For X1 = 0 To Size - 1
                            For Y1 = 0 To Size * HeightMulti - 1
                                Pic.SetPixel(X1, Y1, Picture.GetPixel(X * Size + X1, Y * Size * HeightMulti + Y1))
                            Next
                        Next
                        Pic.Save(Filename + "+" + I.ToString + ".png")
                        I += 1
                        Pic.Dispose()
                    Next
                Next
                Picture.Dispose()
            End If
        End If
    End Sub

    Public Shared Sub ConvertPictures(ByVal Folder As String, ByVal Colortable As String)
        If Not Folder.EndsWith("\") Then Folder += "\"
        If My.Computer.FileSystem.DirectoryExists(Folder) Then
            If My.Computer.FileSystem.FileExists(Colortable) Then
                Dim Colors As Bitmap = Image.FromFile(Colortable)
                My.Computer.FileSystem.CreateDirectory(Folder + "Files\")
                For Each File In My.Computer.FileSystem.GetFiles(Folder, FileIO.SearchOption.SearchTopLevelOnly, "*.png")
                    If File.ToLower <> Colortable.ToLower Then
                        Dim Pic As Bitmap = Image.FromFile(File)
                        For Y = 1 To Colors.Height - 1
                            Dim Clone As Bitmap = Pic.Clone()
                            For X1 = 0 To Colors.Width - 1
                                Clone = Grafikengine.Pixelneueinfaerben(Clone, Colors.GetPixel(X1, 0), Colors.GetPixel(X1, Y))
                            Next
                            Clone.Save(Folder + "Files\" + File.Replace(Folder, "").Replace(".png", Y.ToString + ".png"), System.Drawing.Imaging.ImageFormat.Png)
                            Clone.Dispose()
                        Next
                    End If
                Next
            End If
        End If
    End Sub
#End Region


End Class
